题目描述
如果一个数 x(0< x< p),满足集合 {xi%p∣1≤i< p} 等价于集合 {1,⋯,p−1},则我们称 x 为质数 p 的一个原根。例如,假设 p 为 3,2 的各项幂对 3 取余的结果为 2,1,则 2 为质数 p 的一个原根。
现在已知一个质数 p,求质数 p 的原根个数。
输入格式
输入有多组数据,不超过100行。
每组数据输入一行,输入一个质数 p(3≤p≤100,000)。
输出格式
对于每组测试数据,输出一行,输出质数 p 的原根个数。
简要分析
求一个数n的原根=求数n-1的欧拉函数。
ac代码
#include <iostream>//原理:∅(n)=O(n-1)求质数n的原根个数,等价于求n-1的欧拉函数
using namespace std;
int euler(int n){
int res=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
res=res/i*(i-1);
while(n%i==0){
n/=i;
}
}
}
if(n>1){
res=res/n*(n-1);
}
return res;
}
int main()
{
int n;
while(cin>>n)
cout<<euler(n-1)<<endl;
return 0;//give me five
}