#include<cmath>
#include<iostream>
using namespace std;
const int maxn=1000000+10;
typedef long long ll;
bool not_pri[maxn];
int cnt=0,pri[maxn>>3];
void init()
{
for(int i=2;i<maxn;i++){
if(not_pri[i]) continue;
pri[cnt++]=i;
for(int j=i+i;j<maxn;j+=i) not_pri[j]=1;
}
}
ll pow(int a,int n,int p) //a^n%p
{
ll base=a,ret=1;
while(n){
if(n&1) ret=ret*base%p;
base=base*base%p;n>>=1;
}return ret;
}
int cal(int a,int p)
{
if(a%p==0) return 0;
return pow(a,p/2,p)==1?1:-1;
}
int main()
{
int a,n;init();
while(cin>>a>>n)
{
int ans=1;
if(not_pri[n])
{
for(int i=0;pri[i]<=n;i++)
{
if(n%pri[i]) continue;
int cnt=0;
while(n%pri[i]==0) n/=pri[i],cnt++;
int tmp=cal(a,pri[i]);
if(tmp==-1&&cnt%2==0) tmp=1;
ans*=tmp;
}
}
else ans=cal(a,n);
cout<<ans<<endl;
}
return 0;
}
a^((p-1)/2)%p==1,则有解
HDU 3589 Jacobi symbol 【二次剩余】
最新推荐文章于 2019-03-17 09:07:08 发布