View Code
1 /* 2 欧拉函数+求与之互素的数的个数 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 #include<vector> 11 #include<map> 12 #include<math.h> 13 typedef long long ll; 14 //typedef __int64 int64; 15 const int maxn = 40005; 16 const int inf = 0x7FFFFFFF; 17 const double pi = acos(-1.0); 18 const double eps = 1e-8; 19 using namespace std; 20 int prime[ 50001 ],shu[ 50001 ]; 21 int getPrime( int n ){ 22 for( int i=1;i<n;i+=2 ) shu[ i ] = 1; 23 for( int i=0;i<n;i+=2 ) shu[ i ] = 0; 24 shu[ 1 ] = 0; 25 shu[ 2 ] = 1; 26 for( int i=3;i<n;i+=2 ){ 27 if( shu[i]==1 ){ 28 int t,delta; 29 delta = i*2; 30 t = delta+i; 31 while( t<n ){ 32 shu[ t ] = 0; 33 t += delta; 34 } 35 } 36 } 37 int cnt = 1; 38 for( int i=2;i<n;i++ ){ 39 if( shu[i]==1 ){ 40 prime[ cnt++ ] = i; 41 //printf("%d\n",i); 42 } 43 } 44 return cnt; 45 } 46 int main(){ 47 //freopen( "in2.txt","r",stdin ); 48 //freopen( "out.txt","w",stdout ); 49 int ca; 50 int cnt = getPrime( 50001 ); 51 52 scanf("%d",&ca); 53 while( ca-- ){ 54 int n; 55 scanf("%d",&n); 56 57 if( shu[n]==1 ){ 58 printf("%d\n",n-1); 59 continue; 60 } 61 62 int ans[ maxn ]; 63 int tt = 0; 64 for( int i=1;i<cnt/*prime[i]*prime[i]<=n*/;i++ ){//在这里 WA了4,5次。。。 65 if( n%prime[i]==0 ){ 66 ans[ tt++ ] = prime[i]; 67 //printf("%d\n",prime[i]); 68 } 69 } 70 int res = n; 71 for( int i=0;i<tt;i++ ){ 72 res = res*( ans[i]-1 )/ans[i]; 73 } 74 //printf("n:%d ",n); 75 printf("%d\n",res); 76 } 77 return 0; 78 }
没什么好说的。。。wa了几次。。。因为for循环条件没写好。。
欧拉函数。。。