题意为:给一个数M,求模M的所有原根。
原根:(与M互质,小于M)以g为底,使g的j次方%M所得值为1的最小指数j为phi(M)时,g便是M的一个原根。
方法:按题目说的去模拟吧-_-!.
代码如下
#include<iostream>
#include<math.h>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int m,phi=0;
inline int gcd(int x,int y)
{
if (y==0)
return x;
return gcd(y,x%y);
}
int main()
{
scanf("%d",&m);
for(int i=1;i<m;i++)
{
if(gcd(m,i)==1)
{
phi++;
}
}//裸求欧拉函数
bool flag=0;
for(int i=1;i<=m;i++)
{
if(gcd(i,m)==1)//如果互质
{
int jian=1;
int jk=0;
for(int j=1;j<=phi;j++)
{
jian=(jian*i)%m;//看i的几次方%m=1
if(jian==1)
{
jk=j;
break;
}
}
if(jk==phi)//如果最小的次方数是m的欧拉函数
{
flag=1;//有
cout<<i<<endl;//输出它
}
}
}
if(flag==0)
{
cout<<-1<<endl;//如果没有输出-1
}
}