给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
那么我们求
标签:
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
那么我们求
一个整数N
如题
hint
对于样例(2,2),(2,4),(3,3),(4,2)
1<=N<=10^7;
思路:欧拉函数;
要求<=N有多少对数的gcd是素数;
但这些数对除去最大公约数时他们的最大公约数是1,那么我们只要筛选出[1,N]的素数。
素数的数组是a[];那么在[1,N]中找含有素数a[i]的数那么就是N/a[i]个,然后求这些数的每个的欧拉函数,再前缀和加下,除了oula[1]外,oula[]*=2;
枚举每个小余等于N的素数加oula[]前缀和;
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<stdlib.h> 5 #include<string.h> 6 #include<math.h> 7 using namespace std; 8 typedef long long LL; 9 int ans[1000000]; 10 LL oula[10000005]; 11 LL ask[10000005]; 12 int ola(int n); 13 int main(void) 14 { 15 int i,j,k; 16 17 LL n,m; 18 scanf("%lld",&n); 19 int cnt=ola(n); 20 LL sum=0; 21 for(i=0; i<cnt; i++) 22 { 23 sum+=oula[n/ans[i]]; 24 } 25 printf("%lld\n",sum); 26 return 0; 27 } 28 int ola(int n) 29 { 30 int i,j; 31 oula[1]=1; 32 int cnt=0; 33 for(i=0;i<=n;i++) 34 { 35 oula[i]=i; 36 } 37 for(i=2; i<=n; i++) 38 { 39 if(oula[i]==i) 40 { 41 for(j=i; j<=n; j+=i) 42 { 43 oula[j]=oula[j]/i*(i-1); 44 } 45 } 46 } 47 for(i=2; i<=n; i++) 48 { 49 if(oula[i]==i-1) 50 { 51 ans[cnt++]=i; 52 } 53 } 54 for(i=2; i<=n; i++) 55 { 56 oula[i]*=2; 57 oula[i]+=oula[i-1]; 58 } 59 return cnt; 60 }
标签:
原文地址:http://www.cnblogs.com/zzuli2sjy/p/5469438.html