您的位置:首页 > 其它

pku1284(求原根,欧拉函数)

2010-07-16 22:25 302 查看
http://162.105.81.212/JudgeOnline/problem?id=1284

题意:p是奇素数,如果{xi%p | 1 <= i <= p - 1} = {1,2,...,p-1},则称x是p的原根.

给出一个p,问它的原根有多少个.

思路来源:http://kb.cnblogs.com/a/1307233/

{xi%p | 1 <= i <= p - 1} = {1,2,...,p-1} 等价于 {xi%(p-1) | 1 <= i <= p - 1} = {0,1,2,...,p-2},即为(p-1)的完全剩余系

若x,x2...x(p-1)是(p-1)的完全剩余系,

根据定理,可以推出若gcd(x, p-1) = 1时, (1,x,...,x(p-2))也是(p-1)的完全剩余系

因为若xi != xj (mod p-1),那么x*xi != x*xj (mod p-1),与条件m矛盾,所以 xi = xj (mod p-1),

由此可以确定答案为EulerPhi(p-1)

#include<iostream>
#include<cmath>
using namespace std;
int p;
int euler(int x)
{
int i, res = x;
for(i=2; i<(int)sqrt(x*1.0) + 1; i++)
{
if(x % i == 0)
{
res = res / i * (i - 1);
while(x % i == 0)	//保证i一定是素数
x /= i;
}
}
if(x > 1)
res = res / x * (x - 1);
return res;
}
int main()
{
while(scanf("%d",&p) != EOF)
{
printf("%d/n",euler(p-1));	//p-1的欧拉函数就是p的原根的个数;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: