诶呀题意就是解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");
}
}