首页 > 其他分享 >2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序列的最大公约数为K。 结果可能很大,对1000000007取模。 1 <= N <= 10^5, 1

2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序列的最大公约数为K。 结果可能很大,对1000000007取模。 1 <= N <= 10^5, 1

时间:2023-08-22 14:33:30浏览次数:40  
标签:pow2 1000000007 int MAXN go counts 正数 dp mod

2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K,

返回有多少子序列的最大公约数为K。

结果可能很大,对1000000007取模。

1 <= N <= 10^5,

1 <= arr[i] <= 10^5。

来自腾讯笔试。

来自左程云

答案2023-08-22:

算法过程分步描述如下:

1.初始化数组 dpcntpow2,长度为 MAXN,全部初始值为 0。

2.读取数组长度 N 和正数数组 arr。

3.初始化变量 ii 为 0,用于遍历 arr。

4.设置 pow2[0] 为 1,表示 2^0。

5.遍历数组 arr,从 1 到 N:

a. 读取当前元素 v,即 arr[ii]。

b. 将 v 在 cnt 数组中的计数加 1。

c. 计算 pow2[i]:pow2[i] = (pow2[i-1] * 2) % mod。

6.从 MAXN-1 循环到 1:

a. 初始化 counts 为 0,用于统计具有因子 i 的元素个数。

b. 遍历 cnt 数组,从 i 开始,以 i 为步长,累加 cnt[j] mod mod 到 counts。

c. 计算 dp[i]:dp[i] = (pow2[counts] - 1 + mod) % mod。

d. 从 2*i 开始,以 i 为步长,累减 dp[j] mod mod 到 dp[i]。

7.输出 dp[1],即表示具有最大公约数为 K 的子序列个数。

该算法的时间复杂度为 O(N * log(MAXN)),空间复杂度为 O(MAXN)。

go完整代码如下:

package main

import (
	"fmt"
)

const MAXN = 100001
const mod = 1000000007

var dp = make([]int64, MAXN)
var cnt = make([]int64, MAXN)
var pow2 = make([]int64, MAXN)

func main() {

	buf := []int{7, 1, 3, 5, 15, 3, 105, 35}
	ii := 0
	n := buf[ii]
	ii++
	pow2[0] = 1

	for i := 1; i <= n; i++ {

		v := buf[ii]
		ii++
		cnt[v]++
		pow2[i] = (pow2[i-1] * 2) % mod
	}

	for i := MAXN - 1; i >= 1; i-- {
		counts := int64(0)

		for j := i; j < MAXN; j += i {
			counts = (counts + cnt[j]) % mod
		}

		dp[i] = (pow2[counts] - 1 + mod) % mod

		for j := 2 * i; j < MAXN; j += i {
			dp[i] = (dp[i] - dp[j] + mod) % mod
		}
	}

	fmt.Println(dp[1])
}

2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序列的最大公约数为K。 结果可能很大,对1000000007取模。 1 <= N <= 10^5, 1_数组

rust完整代码如下:

const MAXN: usize = 100001;
const MOD: i64 = 1000000007;

fn main() {
    let buf = [7, 1, 3, 5, 15, 3, 105, 35];
    let mut i: usize = 0;
    let n = buf[i];
    i += 1;
    let mut dp = vec![0; MAXN];
    let mut cnt = vec![0; MAXN];
    let mut pow2 = vec![0; MAXN];
    pow2[0] = 1;

    for j in 1..=n {
        let v = buf[i];
        i += 1;
        cnt[v] += 1;
        pow2[j] = (pow2[j - 1] * 2) % MOD;
    }

    for i in (1..MAXN).rev() {
        let mut counts = 0;

        for j in (i..MAXN).step_by(i) {
            counts = (counts + cnt[j]) % MOD;
        }

        dp[i] = (pow2[counts as usize] - 1 + MOD) % MOD;

        for j in ((2 * i)..MAXN).step_by(i) {
            dp[i] = (dp[i] - dp[j] + MOD) % MOD;
        }
    }

    println!("{}", dp[1]);
}

2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序列的最大公约数为K。 结果可能很大,对1000000007取模。 1 <= N <= 10^5, 1_数组_02

c++完整代码如下:

#include <iostream>
#include <vector>
using namespace std;

const int MAXN = 100001;
const int mod = 1000000007;

vector<long long> dp(MAXN);
vector<long long> cnt(MAXN);
vector<long long> pow2(MAXN);

int main() {
    int buf[] = { 7, 1, 3, 5, 15, 3, 105, 35 };
    int ii = 0;
    int n = buf[ii++];
    pow2[0] = 1;

    for (int i = 1; i <= n; i++) {
        int v = buf[ii++];
        cnt[v]++;
        pow2[i] = (pow2[i - 1] * 2) % mod;
    }

    for (int i = MAXN - 1; i >= 1; i--) {
        long long counts = 0;

        for (int j = i; j < MAXN; j += i) {
            counts = (counts + cnt[j]) % mod;
        }

        dp[i] = (pow2[counts] - 1 + mod) % mod;

        for (int j = 2 * i; j < MAXN; j += i) {
            dp[i] = (dp[i] - dp[j] + mod) % mod;
        }
    }

    cout << dp[1] << endl;

    return 0;
}

2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序列的最大公约数为K。 结果可能很大,对1000000007取模。 1 <= N <= 10^5, 1_i++_03

c完整代码如下:

#include <stdio.h>

#define MAXN 100001
#define mod 1000000007

long long dp[MAXN];
long long cnt[MAXN];
long long pow2[MAXN];

int main() {
    int n;
    int buf[] = { 7, 1, 3, 5, 15, 3, 105, 35 };
    int ii = 0;
    n = buf[ii++];
    pow2[0] = 1;

    for (int i = 1; i <= n; i++) {
        int v = buf[ii++];
        cnt[v]++;
        pow2[i] = (pow2[i - 1] * 2) % mod;
    }

    for (int i = MAXN - 1; i >= 1; i--) {
        long long counts = 0;

        for (int j = i; j < MAXN; j += i) {
            counts = (counts + cnt[j]) % mod;
        }

        dp[i] = (pow2[counts] - 1 + mod) % mod;

        for (int j = 2 * i; j < MAXN; j += i) {
            dp[i] = (dp[i] - dp[j] + mod) % mod;
        }
    }

    printf("%lld\n", dp[1]);

    return 0;
}

2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序列的最大公约数为K。 结果可能很大,对1000000007取模。 1 <= N <= 10^5, 1_数组_04

标签:pow2,1000000007,int,MAXN,go,counts,正数,dp,mod
From: https://blog.51cto.com/moonfdd/7189687

相关文章

  • GoLang:异常处理
    学习自:Go教程137页1、异常程序运行时,发生了不被期望的事件,它阻止程序正常预期的运行Go中两种处理异常的方式:程序异常时,将异常信息反馈给使用者程序异常时,终止运行立刻退出2、打印异常信息1)fmt包中的Errorf函数创建error类型,打印varerrerror=fmt.Errorf("错误信息")......
  • Go-变量
    1变量1.1变量的定义变量表示内存中的一个存储区域,该区域有自己的名称(变量名)和类型(数据类型)变量可以看做是一个房间的门牌号,通过门牌号我们可以找到房间(数据在房间里),房间的类型就是(数据类型),通过变量名可以访问到变量(值)。1.2变量的一般使用步骤packagemainimport"fm......
  • EasyCVR视频融合平台Linux环境下CGO调用C接口推流异常,H.265转H.264失败的原因是?
    EasyCVR视频融合云平台采用云边端一体化架构,可以将分散在仓储各处的前端监控设备(如IPC、NVR等)集中接入,并提供实时视频监控、视频录像、云存储、录像检索与回放、智能告警、云台控制、平台级联、服务器集群等视频能力服务。通过实时高清视频监控,仓储管理人员可以高效地监管人员和货......
  • MongoDB 聚合操作之 $project 操作
     1、MongoDB聚合类操作 2、MongoDB数据操作(八)聚合框架(2)$project 3、$project判断数组中是否包含某元素并返回boolean值 ......
  • Golang - Slice 学习笔记
    Slice1、概述:Slice又称动态数组,依托数组实现,可以方便的进行扩容、传递等,实际使用中比数组更灵活。2、实现原理Slice依托数组实现,底层数组对用户屏蔽,在底层数组容量不足时可以实现自动重分配并生成新的Slice。接下来按照实际使用场景分别介绍其实现机制。2.1Slcie底层结构源......
  • GoLange:面向对象
    学习自:Go教程130页1、类定义方式:结构体+方法结构体:定义有哪些数据方法:定义结构体的方法例子:定义一个Person类//结构体定义人的属性typePersonstruct{namestringageint}//方法定义人的行为func(pPerson)Say(){fmt.Println("mynameis",p.n......
  • GoLang:接口
    学习自:Go教程119页1、说明接口是为了定义某些标准,接口本身不需要实现这些标准。2、定义接口中不能有任何数据字段,只能有函数声明type接口名称interface{函数声明} 接口中嵌入另一个接口但是嵌入的接口中方法不能重名,把自己嵌入自己3、例子1)常规用法定义一......
  • golang 学习笔记 -- for
    forrange 遍历取不到所有元素的指针orgItems:=[]int{1,2,3}varnewItems[]*intfor_,item:=rangeorgItems{fmt.Println(item)//123fmt.Printf("%p\n",&item)//每次地址都是相同的newItems=append(newItems,&item)}for_,ite......
  • ubuntu关闭gonome
    手里一台ubuntu的IPMI后台管理机,平时不跑啥业务,偶尔做做nfs,ftp中转机,不需要图形界面,后台发现资源紧张,干脆把gonome一块儿关了root@santiagod:~#systemctlget-defaultgraphical.targetroot@santiagod:~#systemctlset-defaultmulti-user.targetCreatedsymlink/etc/syst......
  • 因为celcery项目而抛出的 not enough values to unpack (expected 3, got 0)解决方案
    python=36celery=226django=266在自己刚刚接触celery需要写定时任务的时候,按照大佬写的跑一遍的时候(https://blog.csdn.net/qq_36441027/article/details/123851915),发现自己跑的时候, 就会出现这么诡异的问题。解决办法:pipinstall eventlet 再去cmd里面执行cel......