国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > BZOJ 2818 gcd(莫比乌斯反演)

BZOJ 2818 gcd(莫比乌斯反演)

来源:程序员人生   发布时间:2015-07-27 07:53:01 阅读次数:3110次
Gcd
Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%lld & %llu
Submit Status

Description

给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.

Input

1个整数N

Output

如题

Sample Input

4

Sample Output

4


#include<cstdio> #include<algorithm> #include<iostream> #include<cmath> #include<cstring> #include<vector> #define ll long long #define N 10000010 using namespace std; bool check[N+10]; int prime[N]; int mu[N+10]; int tot; int n; void Moblus() { memset(check,0,sizeof check); mu[1]=1; tot=0; for(int i=2; i<N; i++) { if(!check[i]) { prime[tot++]=i; mu[i]=⑴; } for(int j=0; j<tot; j++) { if(i*prime[j]>N)break; check[i*prime[j]]=1; if(i%prime[j]==0) { mu[i*prime[j]]=0; break; } else mu[i*prime[j]]=-mu[i]; } } } int main() { Moblus(); while(scanf("%d",&n)!=EOF) { ll ans=0; for(int i=0; i<tot; i++) { int x=n/prime[i]; if(x==0)break; for(int j=1; j<=x; j++) ans+=(ll)mu[j]*(x/j)*(x/j); } printf("%lld ",ans); } return 0; }


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生