程序员人生 网站导航

BZOJ 2818 gcd(莫比乌斯反演)

栏目:综合技术时间:2015-07-27 07:53:01
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; }


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐