【数论】idoit的乘幂

诶呀题意就是解X^a=b(mod p)和X^c=d(mod p)的同余方程组,同时gcd(a,c)=1,d,p也互质,b,p互质

其实就是把X^1变成X^(ax+cy),然后等于(X^a)^x(X^c)^y就等于b^x*d^y,如果是负数那就变成倒数的形式求一下逆元就好了

#include<cstdio>
#include<cmath>
#include<iomanip>
#include<algorithm>
#define inf 1000000000
using namespace std;
typedef long long LL;
LL read()
{
    LL x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
LL a,b,c,d,p,ans,t;

LL x,y;
void gcd(LL a,LL b)
{
        if (b==0)
        {
                x=1;
                y=0;
                return;
        }
        gcd(b,a%b);
        LL t=x;
        x=y;
        y=t-a/b*x;
}

LL quickmi(LL x,LL y)
{
	if (!y) return 1%p;
	if (y==1) return x%p;
	LL t=quickmi(x,y/2);
	t=(t*t)%p;
	if (y%2) t=(t*x)%p;
	return t;
}

int main()
{
        t=read();
        while (t)
        {
                t--;
                a=read();b=read();c=read();d=read();p=read();
                LL k=b,kk=d;
                gcd(a,c);
                if (x<0)
                {
                        b=quickmi(b,LL(abs(x)));
                        d=quickmi(d,y);
                        gcd(b,p);
                        x=(x%p+p)%p;
                        ans=(d*x)%p;
                }else
                if (y<0)
                {
                        b=quickmi(b,x);
                        d=quickmi(d,LL(abs(y)));
                        gcd(d,p);
                        x=(x%p+p)%p;
                        ans=(b*x)%p;
                }
                if (quickmi(ans,a)==k && quickmi(ans,c)==kk) printf("%lld\n",ans);else printf("No Solution!\n");
        }
}


你可能感兴趣的:(数论)