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)个原根;

View Code
#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;
}

 

 

posted @ 2012-07-18 11:08  wutaoKeen  阅读(145)  评论(0编辑  收藏  举报