您的位置:首页 > 其它

POJ 1284 原根(欧拉函数)

2016-09-27 18:30 302 查看
时空隧道

题目大意:

给出奇素数n,求出n的原根的个数

分析:

暑假没好好听课QAQ…不得不去百度了一发原根是什么…

假设n的原根为x,那么x满足以下性质:

x^1modn与x^2modn与……x^phi(n)modn的ans互不相同

对于此题,题目中规定n是一个奇素数,所以n一定是有原根的(证明自行百度吧233)

接下来介绍一个定理:

n的原根个数=phi(phi(n))

因为n是奇素数所以phi(n)=n-1

所以ans=phi(n-1)

代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;
const int maxn=65536+5;
int n,phi[maxn],prime[maxn],vis[maxn],cnt;
signed main(void){
memset(vis,0,sizeof(vis)),cnt=0;
for(int i=2;i<=65536;i++){
if(!vis[i])
prime[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&prime[j]*i<=65536;j++){
vis[prime[j]*i]=1;
if(i%prime[j]==0){
phi[i*prime[j]]=prime[j]*phi[i];
break;
}
else
phi[i*prime[j]]=(prime[j]-1)*phi[i];
}
}
while(scanf("%d",&n)!=EOF)
cout<<phi[n-1]<<endl;
return 0;
}


by >_< NeighThorn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: