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