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;

}

 

 

你可能感兴趣的:(root)