【POJ1284】Primitive Roots
【题目大意】
给你一个素数n,求n的原根个数。
【题解】
关于原根有一个定理:
定理:如果模有原根,那么它一共有个原根。
所以这题就是求phi[phi[n]]
很简单吧。。。(如果知道这个定理的话)
1 /************** 2 POJ 1284 3 by chty 4 2016.11.10 5 **************/ 6 #include<iostream> 7 #include<cstdio> 8 #include<cstdlib> 9 #include<cstring> 10 #include<ctime> 11 #include<cmath> 12 #include<algorithm> 13 using namespace std; 14 #define FILE "read" 15 #define MAXN 70010 16 int n,cnt,prime[MAXN],isprime[MAXN],phi[MAXN]; 17 inline int read() 18 { 19 int x=0,f=1; char ch=getchar(); 20 while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();} 21 while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();} 22 return x*f; 23 } 24 void get() 25 { 26 phi[1]=1; 27 for(int i=2;i<=70000;i++) 28 { 29 if(!isprime[i]) prime[++cnt]=i,phi[i]=i-1; 30 for(int j=1;j<=cnt&&prime[j]*i<=70000;j++) 31 { 32 isprime[prime[j]*i]=1; 33 if(i%prime[j]==0) {phi[prime[j]*i]=phi[i]*prime[j];break;} 34 else phi[prime[j]*i]=phi[i]*(prime[j]-1); 35 } 36 } 37 } 38 int main() 39 { 40 freopen(FILE".in","r",stdin); 41 freopen(FILE".out","w",stdout); 42 get(); 43 while(~scanf("%d",&n)) printf("%d\n",phi[phi[n]]); 44 return 0; 45 }