#include <bits/stdc++.h>
using namespace std;
const int MAXN=100100;
int prime[MAXN],npri[MAXN],dive[MAXN];
int psum,cnt;
void isprime()
{
int i,j;
psum=0;
memset(npri,0,sizeof(npri));
for(i=2;i<MAXN;i++)
{
if(!npri[i])
{
prime[psum++]=i;
for(j=i+i;j<MAXN;j+=i)
{
npri[j]++;
}
}
}
}
void divide(int n)
{
int i,b=sqrt(n);
cnt=0;
for(i=0;prime[i]<=b;i++)
{
if(n%prime[i]==0)
{
dive[cnt++]=prime[i];
while(n%prime[i]==0)
n/=prime[i];
}
}
if(n>1)
dive[cnt++]=n;
}
long long powmod(long long x,long long p,long long mod)
{
long long ret=1;
while(p)
{
if(p&1)
ret=ret*x%mod;
x=x*x%mod;
p>>=1;
}
return ret;
}
int main()
{
int n,i,j,flag,tmp;
isprime();
while(cin>>n)
{
divide(n-1);
for(i=2;i<n;i++)
{
flag=1;
for(j=0;j<cnt;j++)
{
tmp=(n-1)/dive[j];
if(powmod(i,tmp,n)==1)
{
flag=0;
break;
}
}
if(flag)
{
cout<<i<<endl;
break;
}
}
}
}
51nod 1135 原根
最新推荐文章于 2018-06-11 21:54:49 发布