BZOJ2818: Gcd
2016-03-09 16:48
176 查看
Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.
Input
一个整数NOutput
如题Sample Input
4Sample Output
4HINT
hint对于样例(2,2),(2,4),(3,3),(4,2)
1<=N<=10^7
手推公式可得
#include<cstdio> #include<cctype> #include<queue> #include<cmath> #include<cstring> #include<algorithm> #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define ren for(int i=first[x];i;i=next[i]) using namespace std; const int BufferSize=1<<16; char buffer[BufferSize],*head,*tail; inline char Getchar() { if(head==tail) { int l=fread(buffer,1,BufferSize,stdin); tail=(head=buffer)+l; } return *head++; } inline int read() { int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f; } typedef long long ll; const int maxn=10000010; int vis[maxn],pri[maxn/10],mu[maxn],f[maxn],cnt; void solve(int n) { vis[1]=mu[1]=1; rep(i,2,n) { if(!vis[i]) pri[++cnt]=i,mu[i]=-1; rep(j,1,cnt) { if(i*pri[j]>n) break; vis[i*pri[j]]=1; if(i%pri[j]==0) {mu[i*pri[j]]=0;break;} mu[i*pri[j]]=-mu[i]; } } rep(i,1,cnt) { int x=pri[i]; for(int j=x;j<=n;j+=x) f[j]+=mu[j/x]; } ll ans=0; rep(i,1,n) ans+=(ll)(n/i)*(n/i)*(ll)f[i]; printf("%lld\n",ans); } int main() { solve(read()); return 0; }
View Code
相关文章推荐
- CoreData多线程安全
- CentOS7最小化安装以后没有ifconfig这个命令的解决方案
- hibernate主键和数据库主键
- 利用ViewDragHelper实现3d效果的View
- SDL2 显示图片的简单流程
- 单元测试系列1——选择测试框架
- Android学习之Timer和TimerTask
- Dockerfile制作tomcat镜像
- [RxJS] Updating Data with Scan
- 第二周上机实践项目 项目2-就拿胖子说事(1)
- 注册谷歌帐号以及用其他镜像解决android sdk的下载问题(已解决)
- 数学之美5
- 转载---Ubuntu屏幕分辨率设置
- Servlet 3.1 标准(一)
- java中会存在内存泄漏吗,请简单描述?
- Servlet 3.1 标准(一)
- 修改苹果Mac终端前面的计算机名
- dispatchKeyEvent不响应Instrumentation模拟发送的按键
- Python中的模块与包
- jquery.validate.js常用扩展函数