题目描述
如果一个数 x(0<x<p),满足集合{x i %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 的原根个数。
样例输入
11
13
17
样例输出
4
4
8
思路
一个数的原根个数等于该数-1的欧拉函数值
AC代码
#include <iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
int res = n-1;
for(int i = 2;i*i<=n-1;i++){
if((n-1)%i==0){
res = res/i*(i-1);
while((n-1)%i==0){
n=(n-1)/i+1;
}
}
}
if(n-1>1){
res = res/(n-1)*(n-2);
}
cout<<res<<endl;
}
}