Files
OI-source/8.2242.cpp
2023-08-03 09:22:52 +08:00

80 lines
1.2 KiB
C++

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
typedef long long LL;
LL ksm(LL a,LL b,LL p)
{
LL res=1;
for(;b;b>>=1,a=a*a%p) b&1?res=res*a%p:0;
return res;
}
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0) { x=1; y=0; return a; }
LL d=exgcd(b,a%b,y,x);
y-=x*(a/b);
return d;
}
int T,K;
void a()
{
while(T-->0)
{
LL y,z,p; scanf("%lld%lld%lld",&y,&z,&p);
printf("%lld\n",ksm(y,z,p));
}
}
void b()
{
while(T-->0)
{
LL y,z,p,x,r; scanf("%lld%lld%lld",&y,&z,&p);
LL d=exgcd(y,p,x,r);
if(z%d) puts("Orz, I cannot find x!");
else printf("%lld\n",(z/d*x%p+p)%p);
}
}
LL BSGS(LL a,LL b,LL p)
{
b%=p;
map<LL,int> mp;
int t=(int)sqrt(p)+1;
LL x=b,y=ksm(a,t,p);
if(y==0) return b==0?1:-1;
for(int j=0;j<=t-1;j++)
{
mp[x]=j;
x=x*a%p;
}
x=1;
for(int i=0,j;i<=t;i++)
{
if(mp.find(x)!=mp.end()&&i*t-(j=mp[x])>=0) return i*t-j;
x=x*y%p;
}
return -1;
}
void c()
{
while(T-->0)
{
LL y,z,p; scanf("%lld%lld%lld",&y,&z,&p);
LL d=BSGS(y,z,p);
if(d==-1) puts("Orz, I cannot find x!");
else printf("%lld\n",d);
}
}
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
scanf("%d%d",&T,&K);
if(K==1) a();
else if(K==2) b();
else c();
return 0;
}