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 <= 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的更多相关文章
- HDU 1212 大整数的取模运算
因为这里是MOD最大为100000 所以我将字符串看作5个一组,并记录后面跟了多少个100000 每次取5个数根据其数据进行取模更新 注意过程中 100000*100000会超int #include ...
- 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
include "stdafx.h" #include<iostream> #include<vector> #include <algorithm& ...
- 请用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++){ ...
- C语言:利用指针解决:统计一个长度为2的字符串在另外一个字符串中出现的次数。
//统计一个长度为2的字符串在另外一个字符串中出现的次数. #include <conio.h> #include <stdio.h> #include <string. ...
- cf166e 在四面体上寻找路线数 递推,取模
来源:codeforces E. Tetrahedron You are given a tetrahedron. Let's mark its vertices ...
- 3-为什么很多 对 1e9+7(100000007)取模
首先有很多题目的答案是很大的,然而出题人的本意也不是让选手写高精度或者Java,所以势必要让答案落在整型的范围内.那么怎么做到这一点呢,对一个很大的质数取模即可(自行思考为什么不是小数).那么如果您学 ...
- HDU 5698 大组合数取模(逆元)
瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- np问题(大数阶乘取模)
转自 np问题 题目描述: LYK 喜欢研究一些比较困难的问题,比如 np 问题. 这次它又遇到一个棘手的 np 问题.问题是这个样子的:有两个数 n 和 p,求 n 的阶乘对 p 取模后的结果. L ...
- hdoj 4828 卡特兰数取模
Grids Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Sub ...
- HDU 6211 卡常数取模 预处理 数论
求所有不超过1e9的 primitive Pythagorean triple中第2大的数取模$2^k$作为下标,对应a[i]数组的和. 先上WIKI:https://en.wikipedia.org ...
随机推荐
- KubeCon EU 2023 落幕,哪些技术趋势值得关注?
KubeCon+CloudNativeCon 是云原生领域的技术盛会,上个月月末,在荷兰阿姆斯特丹举办的欧洲 KubeCon+CloudNativeCon 刚刚落下帷幕,此次大会吸引了10000多名参 ...
- DevEco Studio 3.1 Release | 动态共享包开发,编译更快,包更小
原文:https://mp.weixin.qq.com/s/qPvHZNZuLccAsviBcXtPWw,点击链接查看更多技术内容. 动态共享包(HSP)开发是DevEco Studio 3.1 ...
- web自动化10-窗口截图、验证码处理
窗口截图 1.是什么 说明:把当前操作的页面,截图保存到指定位置 2.代码中怎么使用? 说明:在Selenium中,提供了截图方法,我们只需要调用即可 方法: driver.get_screensho ...
- Windows常用的 CMD 命令合集
常用的 CMD 命令合集: 基础命令 dir:列出当前目录中的文件和子目录. cd:更改当前目录.例如,cd Documents 将当前目录更改为 Documents 文件夹. md 或 mkdir: ...
- [abc279 G] At Most 2 Colors
G - At Most 2 Colors (atcoder.jp) 重点讲解方法三,因为方法三是蒟蒻都能想出来的方法一和方法二都可以借助方法三的思想推出 方法一 这是最简单的设置状态的方法,\(dp[ ...
- Go 语言 map 是并发安全的吗?
原文链接: Go 语言 map 是并发安全的吗? Go 语言中的 map 是一个非常常用的数据结构,它允许我们快速地存储和检索键值对.然而,在并发场景下使用 map 时,还是有一些问题需要注意的. 本 ...
- 今天在内部 Galaxy 分析平台操作探针引物设计小工具程序,调用 Ensembl API 获取相关序列和信息时,发现官网 MySQL server 异常,报告问题后当天晚上就收到了回复,并且修......
本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...
- [Qt开发]一口气搞懂串口通信
好多小鳄鱼 一.关于串口通信: Qt的确有自己的串口通信类,就是QSerialPort,但是我们在使用过程中因为要更加定制化的使用串口通信类减小开发的难度,所以我们会提供一个串口通信类,也就是这个Se ...
- PicoRV32-on-PYNQ-Z2: An FPGA-based SoC System——RISC-V On PYNQ项目复现
本文参考: 1️⃣ 原始工程 2️⃣ 原始工程复现教程 3️⃣ RISCV工具链安装教程 本文工程: https://bhpan.buaa.edu.cn:443/link/4B08916BF2CDB4 ...
- ClickHouse技术研究及语法简介
本文对Clickhouse架构原理.语法.性能特点做一定研究,同时将其与mysql.elasticsearch.tidb做横向对比,并重点分析与mysql的语法差异,为有mysql迁移clickhou ...