题目描述
一个整数x(0 < x < p)是奇素数p的原根,当且仅当集合{(xi mod p)|1<=i<=p-1}与集合{1,…,p-1}是相同的。例如,3的连续的次幂对7取模的结果是3,2,6,4,5,1,所有3是7的原根。 给出一个奇素数p(3<=p<65536),编程求出p的原根的个数。
输入格式
输入包括多行,每行一个奇素数p。
输出格式
对应每组输入,输出占一行为原根的个数。
样例数据
样例输入
23 31 79
样例输出
10 8 24
题目分析
x的原根就是φ(φ(x)),因为是奇素数,故φ(x)=x-1,原根就是φ(x-1)
源代码
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
inline const long long Get_Int() {
long long num=
0,bj=
1;
char x=getchar();
while(x<
'0'||x>
'9') {
if(x==
'-')bj=-
1;
x=getchar();
}
while(x>=
'0'&&x<=
'9') {
num=num*
10+x-
'0';
x=getchar();
}
return num*bj;
}
int Phi[
100005];
void Euler_Table(
int n) {
memset(Phi,
0,
sizeof(Phi));
Phi[
1]=
1;
for(
int i=
2; i<=n; i++)
if(Phi[i]==
0)
for(
int j=i; j<=n; j+=i) {
if(Phi[j]==
0)Phi[j]=j;
Phi[j]=Phi[j]/i*(i-
1);
}
}
int n;
int main() {
Euler_Table(
100000);
while(
cin>>n)
printf(
"%d\n",Phi[n-
1]);
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-600019.html