HDU 3589 二次剩余

来源:互联网 发布:压声喊麦软件效果器 编辑:程序博客网 时间:2024/05/17 01:39

概念原理看置顶文

#include<stdio.h>#include<string.h>#include<math.h>#define ll __int64#define maxn 1000010ll prime[maxn];bool isprime[maxn];ll exp(ll a,ll b,ll p){    ll res=1;    for(;b;b>>=1)    {        if(b&1)        res=(res*a)%p;        a=(a*a)%p;    }    return res;}int cal(int a,int n){    if(a%n==0)    return 0;    else    return exp(a,(n-1)/2,n)==1?1:-1;}int main(){    freopen("in.txt","r",stdin);    memset(isprime,true,sizeof(isprime));    for(int i=2;i<maxn;i++)    {        for(int j=2;i*j<maxn;j++)        isprime[i*j]=0;    }    int k=0;    for(int i=2;i<maxn;i++)    {        if(isprime[i])        prime[k++]=i;    }    int a,n;   while(scanf("%d%d",&a,&n)==2)   {        int ans;        if(isprime[n]==0)        {        ans=1;        for(int i=0;n!=1&&i<k;i++)        {            if(n%prime[i]==0)            {                int total=0;                while(n%prime[i]==0)                {                    total++;                    n/=prime[i];                }                int tmp=cal(a,prime[i]);                if(total%2==0&&tmp==-1)                tmp=1;                ans*=tmp;            }        }        }        else        ans=cal(a,n);        printf("%d\n",ans);   }    return 0;}