【BZOJ 2818】Gcd
2015-07-11 16:48
253 查看
这题一开始我竟然想要用与能量采集差不多的思路去做= =(no zuo no die,why you try?)
有个显然的转化
∑nx=1∑ny=1[gcd(x,y)==P]=∑⌊n/P⌋x=1∑⌊n/P⌋y=1[gcd(x,y)==1]=2∗∑⌊n/P⌋i=2ϕ(i)+1\sum_{x=1}^{n}\sum_{y=1}^{n} [gcd(x,y)==P]=
\sum_{x=1}^{\lfloor n/P \rfloor}\sum_{y=1}^{\lfloor n/P \rfloor}[gcd(x,y)==1]=2*\sum_{i=2}^{\lfloor n/P \rfloor} \phi (i)+1
然后我们线性筛出欧拉函数,在前缀和就可以O(n)O(n)求出答案了
code:
有个显然的转化
∑nx=1∑ny=1[gcd(x,y)==P]=∑⌊n/P⌋x=1∑⌊n/P⌋y=1[gcd(x,y)==1]=2∗∑⌊n/P⌋i=2ϕ(i)+1\sum_{x=1}^{n}\sum_{y=1}^{n} [gcd(x,y)==P]=
\sum_{x=1}^{\lfloor n/P \rfloor}\sum_{y=1}^{\lfloor n/P \rfloor}[gcd(x,y)==1]=2*\sum_{i=2}^{\lfloor n/P \rfloor} \phi (i)+1
然后我们线性筛出欧拉函数,在前缀和就可以O(n)O(n)求出答案了
code:
[code]#include<iostream> #include<cstdio> #include<cstring> using namespace std; long long f[10000001]; int phi[10000001],p[700001]; long long ans=0; long long s[10000001]; int a[10000001],n; int main() { long long i,t=0,j; scanf("%lld",&n); a[1]=1; phi[1]=1; for (i=2;i<=n;++i) { if (!a[i]) { p[++t]=i; phi[i]=i-1; } for (j=1;j<=t;++j) { if (i*p[j]>n) break; a[i*p[j]]=1; if (i%p[j]==0) { phi[i*p[j]]=phi[i]*p[j]; break; } else phi[i*p[j]]=phi[i]*(p[j]-1); } } s[1]=0; for (i=2;i<=n;++i) s[i]=s[i-1]+phi[i]; for (i=1;i<=n;++i) f[i]=2*s[i]+1; for (i=1;i<=t;++i) ans=ans+f[n/p[i]]; printf("%lld\n",ans); }
相关文章推荐
- Ubuntu搭建Note.Js 平台
- 基于LVM的Xen的部署(一)
- C++中的空类,默认产生哪些类成员函数?
- @(报错)could not find the main class, Program will exit(已解决)
- 9.装饰者模式(Decorator Pattern)
- Android主线程、子线程通信(Thread+handler)
- C#中的委托和事件
- 【LeetCode】235. Lowest Common Ancestor of a Binary Search Tree (2 solutions)
- MBProgressHUD 第三方详解学习
- 无法删除AVD
- Java基础-- Java API
- CSAPP LAB---Proxy lab
- UI2_ScrollView&UIPageControl
- VC++ 6.0 C8051F340 USB 通信 CAN 数据解析
- StringBuffer类
- 编程开发中最浪费时间和资源的7个错误
- 10755 - Garbage Heap
- C++设计模式——单例模式
- [转载]深入JVM锁机制-synchronized
- Linux系统中SAR命令说明