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

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

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

1 <= N <= 10^5,

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

来自腾讯笔试。

来自左程云。

答案2023-08-22:

算法过程分步描述如下:

1.初始化数组 dp、cnt 和 pow2,长度为 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])
}

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]);
}

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;
}

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的更多相关文章

  1. HDU 1212 大整数的取模运算

    因为这里是MOD最大为100000 所以我将字符串看作5个一组,并记录后面跟了多少个100000 每次取5个数根据其数据进行取模更新 注意过程中 100000*100000会超int #include ...

  2. 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

    include "stdafx.h" #include<iostream> #include<vector> #include <algorithm& ...

  3. 请用js语言实现sort排序函数,要求:sort([4,5,2,-1,0])返回[-1,0,2,4,5]

    Array.prototype.sort1=function(fn){ var len=this.length; while(len>0){ for(var i=0;i<len;i++){ ...

  4. C语言:利用指针解决:统计一个长度为2的字符串在另外一个字符串中出现的次数。

    //统计一个长度为2的字符串在另外一个字符串中出现的次数. #include <conio.h> #include <stdio.h> #include <string. ...

  5. cf166e 在四面体上寻找路线数 递推,取模

    来源:codeforces                 E. Tetrahedron   You are given a tetrahedron. Let's mark its vertices ...

  6. 3-为什么很多 对 1e9+7(100000007)取模

    首先有很多题目的答案是很大的,然而出题人的本意也不是让选手写高精度或者Java,所以势必要让答案落在整型的范围内.那么怎么做到这一点呢,对一个很大的质数取模即可(自行思考为什么不是小数).那么如果您学 ...

  7. HDU 5698 大组合数取模(逆元)

    瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  8. np问题(大数阶乘取模)

    转自 np问题 题目描述: LYK 喜欢研究一些比较困难的问题,比如 np 问题. 这次它又遇到一个棘手的 np 问题.问题是这个样子的:有两个数 n 和 p,求 n 的阶乘对 p 取模后的结果. L ...

  9. hdoj 4828 卡特兰数取模

    Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Sub ...

  10. HDU 6211 卡常数取模 预处理 数论

    求所有不超过1e9的 primitive Pythagorean triple中第2大的数取模$2^k$作为下标,对应a[i]数组的和. 先上WIKI:https://en.wikipedia.org ...

随机推荐

  1. 2021-04-26:整型数组arr长度为n(3 <= n <= 10^4),最初每个数字是<=200的正数且满足如下条件: 1. arr[0] <= arr[1]。2.arr[n-1] <= arr

    2021-04-26:整型数组arr长度为n(3 <= n <= 10^4),最初每个数字是<=200的正数且满足如下条件: 1. arr[0] <= arr[1].2.arr ...

  2. 2021-07-30:两个有序数组间相加和的Topk问题。给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1和arr2的两个数相加和最大的前k个,两个数必须分别来自两个数组。按照降

    2021-07-30:两个有序数组间相加和的Topk问题.给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1和arr2的两个数相加和最大的前k个,两个数必须分别来自两个数组.按照降 ...

  3. Java JDK1.8环境变量配置

    Java JDK1.8.0_152下载地址:https://pan.baidu.com/s/1BRB2MRETPdWVL-IN2FRTEw   提取码:63jb 下载好后傻瓜式一键Next下载就好,默 ...

  4. web自动化08-下拉选择框、弹出框、滚动条

    1.下拉选择框操作 下拉框就是HTML中<select>元素:   先列需求: 需求:使用'注册A.html'页面,完成对城市的下拉框的操作 1).选择'广州' 2).暂停2秒,选择'上海 ...

  5. 【操作日志】如何在一个SpringBoot+Mybatis的项目中设计一个自定义ChangeLog记录?

    设计一个业务改动信息时的自定义记录,例如新增.修改.删除数据等.并且记录的规则可以通过配置的方式控制.大家需要根据各自业务场景参考,欢迎讨论.伪代码如下: 实体类: @TableName(" ...

  6. RocketMQ 顺序消费机制

    顺序消息是指对于一个指定的 Topic ,消息严格按照先进先出(FIFO)的原则进行消息发布和消费,即先发布的消息先消费,后发布的消息后消费. 顺序消息分为分区顺序消息和全局顺序消息. 1.分区顺序消 ...

  7. Rust的类型系统

    Rust的类型系统 类型于20世纪50年代被FORTRAN语言引入,其相关的理论和应用已经发展得非常成熟.现在,类型系统已经成为了各大编程语言的核心基础. 通用基础 所谓类型,就是对表示信息的值进行的 ...

  8. CSS3+Jquery实现带动画效果的下拉选择框

    CSS3+JQuery实现带动画效果的下拉选择框. 元素结构为: 1 <div class="box"> 2 <p>this is the first li ...

  9. StencilJs 学习之 JSX

    Stencil 组件使用 JSX 渲染,这是一种流行的声明式模板语法.每个组件都有一个渲染函数,它返回在运行时渲染到 DOM 的组件树. 基础用法 render 函数用于输出将绘制到屏幕上的组件树. ...

  10. 简单了解一下国产GPU

    英伟达都一万亿市值了,国产GPU现在发展的怎么样了?万字长文,有兴趣的进来简单了解一下. 最近,与GPU有关的几个科技新闻:一是英伟达NVIDIA市值超过一万亿美元,成为全球第一家市值过万亿的芯片公司 ...