poj 1284 Primitive Roots
这个题是对欧拉函数的运用
题意:
就是给出一个奇素数,求出他的原根的个数。
定义:n的原根x满足条件0<x<n,并且有集合{ (xi mod n) | 1 <= i <=n-1 } 和集合{ 1, ..., n-1 }相等
定理:如果p有原根,则它恰有φ(φ(p))个不同的原根,p为素数,当然φ(p)=p-1,因此就有φ(p-1)个原根;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> using namespace std; int Eular( int n ) { int ans = n; for( int i = 2 ; i*i <= n ; i ++ ) { if( n % i == 0 ) { ans = ans - ans/i; while( n%i == 0 ) n /= i; } } if( n > 1 ) ans = ans - ans/n; return ans; } int main( ) { int m; while( scanf( "%d",&m )==1 ) { printf( "%d\n",Eular(m-1) ); } //system( "pause" ); return 0; }