题目大意:
给出奇素数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