首页 > 代码库 > BZOJ 2818
BZOJ 2818
题面:
2818: Gcd
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 5345 Solved: 2400
[Submit][Status][Discuss]
Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
Input
一个整数N
Output
如题
Sample Input
4
Sample Output
4
HINT
hint
对于样例(2,2),(2,4),(3,3),(4,2)
1<=N<=10^7
Source
湖北省队互测
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 #define LL long long 5 const int maxn=10000001; 6 int mu[maxn+10],prime[maxn+10],g[maxn+10]; 7 int s[maxn+10]; 8 bool book[maxn+10]; 9 int T,n,cnt; 10 void ss() 11 { 12 mu[1]=1; 13 for(int i=2;i<=maxn;i++) 14 { 15 if(!book[i]) 16 { 17 prime[++cnt]=i; 18 mu[i]=-1; 19 g[i]=1; 20 } 21 for(int j=1;j<=cnt&&i*prime[j]<=maxn;j++) 22 { 23 book[i*prime[j]]=true; 24 if(i%prime[j]) 25 mu[i*prime[j]]=-mu[i],g[i*prime[j]]=mu[i]-g[i]; 26 else 27 { 28 mu[i*prime[j]]=0; 29 g[i*prime[j]]=mu[i]; 30 break; 31 } 32 } 33 } 34 s[0]=0; 35 for(int i=1;i<=maxn;i++) 36 s[i]=s[i-1]+g[i]; 37 } 38 LL caculate() 39 { 40 LL ans=0,last; 41 for(int i=1;i<=n;i=last+1) 42 { 43 last=n/(n/i); 44 ans+=(LL)(s[last]-s[i-1])*(n/i)*(n/i); 45 } 46 return ans; 47 } 48 int main() 49 { 50 ss(); 51 scanf("%d",&n); 52 printf("%lld\n",caculate()); 53 }
BZOJ 2818
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。