Darkbzoj 2818 Gcd
2022/1/1 23:11:55
本文主要是介绍Darkbzoj 2818 Gcd,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Darkbzoj 2818 Gcd
链接:https://darkbzoj.tk/problem/2818
规定 \([x]\) 为逻辑判断函数,若 \(x\) 为真则 \([x]=1\),否则 \([x]=0\) 。
这题要我们统计的是:
\[\sum_{i=1}^{m}\sum_{j=1}^{\lfloor\frac{n}{p_i} \rfloor}\sum_{k=1}^{\lfloor\frac{n}{p_i}\rfloor}[gcd(j,k)=1] \]我们可以用莫比乌斯反演化简成:
\[\sum_{i=1}^m\sum_{d=1}^{p_i}\mu(d)\times\lfloor\frac{n}{x}\rfloor^2 \]但是这样子我们的复杂度是 \(O(n^2)\) 的,我们考虑换一种式子的化简方式。我们考虑如何快速求出 \(gcd(x,y)=p\;(x\le n,y\le n)\) 的个数。
个数为:
\[\begin{aligned} Ans&=\sum_{i=1}^{\lfloor\frac{n}{p} \rfloor}\sum_{j=1}^{\lfloor\frac{n}{p}\rfloor}[gcd(i,j)=1] \\ &=-1+2\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}{\sum_{j=1}^{i}[gcd(i,j)=1]} \\ &=-1+2\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor} \varphi(i) \end{aligned} \]解释一下式子,如果 \(gcd(i,j)=1\) 那么一定有 \(gcd(j,i)=1\),所以 \(j\) 只用累计到 \(i\) 就好了,那么 \(\sum_{j=1}^{i}[gcd(i,j)=1]\) 这个式子显然就是 \(\varphi(i)\) 。又因为 \(gcd(1,1)\) 会重复统计 \(1\) 次,所以需要减掉。化简出来的这个式子我们可以用前缀和做到 \(O(n)\) 预处理,\(O(1)\) 查询。欧拉函数和质数也可以用欧拉筛在 \(O(n)\) 的时间内求出。
所以我们只用枚举 \(n\) 之内的质数,然后 \(O(1)\) 查询即可。
总时间复杂度为 \(O(n)\)
代码如下:
#include<bits/stdc++.h> #define ll long long using namespace std; const int MAXN = 1e7+5; int pc,prime[MAXN],p[MAXN],n; ll phi[MAXN]; int main() { scanf("%d",&n); phi[1]=1; for(int i=2;i<=n;++i) { if(!p[i]) prime[++pc]=i,phi[i]=i-1; for(int j=1;j<=pc&&1ll*i*prime[j]<=n;++j) { p[i*prime[j]]=1; if(i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[i*prime[j]]=phi[i]*phi[prime[j]]; } } for(int i=1;i<=n;++i) phi[i]+=phi[i-1]; ll ans=0; for(int i=1;i<=pc;++i) ans+=2*phi[n/prime[i]]-1; printf("%lld\n",ans); return 0; }
这篇关于Darkbzoj 2818 Gcd的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-25TypeScript基础知识详解
- 2024-12-25安卓NDK 是什么?-icode9专业技术文章分享
- 2024-12-25caddy 可以定义日志到 文件吗?-icode9专业技术文章分享
- 2024-12-25wordfence如何设置密码规则?-icode9专业技术文章分享
- 2024-12-25有哪些方法可以实现 DLL 文件路径的管理?-icode9专业技术文章分享
- 2024-12-25错误信息 "At least one element in the source array could not be cast down to the destination array-icode9专业技术文章分享
- 2024-12-25'flutter' 不是内部或外部命令,也不是可运行的程序 或批处理文件。错误信息提示什么意思?-icode9专业技术文章分享
- 2024-12-25flutter项目 as提示Cannot resolve symbol 'embedding'提示什么意思?-icode9专业技术文章分享
- 2024-12-24怎么切换 Git 项目的远程仓库地址?-icode9专业技术文章分享
- 2024-12-24怎么更改 Git 远程仓库的名称?-icode9专业技术文章分享