我开始还以为是求最小原根呢
直接打表+快速幂取模
后来才发现是求原根的个数
结果为phi(n-1)
证明就不再赘述了,网上很多
而且感觉这种题太偏了,没有必要浪费太多时间
代码如下:
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
int euler_phi(int n) {
int m = sqrt(n+0.5);
int ans = n;
for(int i=2; i<=m; ++i) {
if(n%i == 0) {
n /= i;
ans = ans/i*(i-1);
while(n%i == 0)
n /= i;
}
}
if(n > 1)
ans = ans/n*(n-1);
return ans;
}
int main(void) {
int n;
while(scanf("%d", &n) != EOF) {
cout << euler_phi(n-1) << endl;
}
return 0;
}