#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long//这一行
using namespace std;
const int N=1e5+10;
ll y,z,p;
ll Pow[N];
struct Node
{
ll id,val;
}b[N];
int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-48;s=getchar();}
return x*f;
}
ll quickpow(ll a,ll b,ll c)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%c;
a=a*a%c;
b>>=1;
}
return res;
}
bool cmp(Node i,Node j)
{
if(i.val==j.val) return i.id<j.id;
return i.val<j.val;
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1,y=0;
return a;
}
ll x2,y2;
ll d=exgcd(b,a%b,x2,y2);
x=y2,y=x2-y2*(a/b);
return d;
}
ll find(ll x,ll Max)
{
ll l=1,r=Max-1,mid,ans=-1;
while(l<=r)
{
mid=l+r>>1;
if(b[mid].val==x)
{
ans=b[mid].id;
r=mid-1;
}
else if(b[mid].val>x) r=mid-1;
else l=mid+1;
}
return ans;
}
int main()
{
int t=read(),k=read();
while(t--)
{
y=read(),z=read(),p=read();
if(k==1) printf("%lld\n",quickpow(y,z,p));
else if(k==2)
{
ll a,b
ll d=exgcd(y,p,a,b);
if(z%d!=0) printf("Orz, I cannot find x!\n");
else
{
a*=z/d;
printf("%lld\n",(a%(p/d)+p/d)%(p/d));
}
}
else
{
if(y%p==0)
{
if(z==0) printf("0\n");
else printf("Orz, I cannot find x!\n");
continue;
}
ll Max=(ll)sqrt(p-2);
Pow[0]=1;
for(ll i=1;i<=Max;i++)
Pow[i]=Pow[i-1]*y%p;
for(int i=1;i<Max;i++)
{
b[i].val=Pow[i];
b[i].id=i;
}
sort(b+1,b+Max,cmp);
ll q=0,totpow=1;
bool flag=0;
while(q*Max<p-1)
{
ll l,k,d;
d=exgcd(totpow,p,l,k);
l*=z;
l=(l%p+p)%p;
ll ans=find(l,Max);
if(ans!=-1)
{
flag=1;
ans+=q*Max;
break;
}
}
if(!flag) printf("Orz, I cannot find x!\n");
else printf("%lld\n",ans);
}
}
return 0;
}
代码中注释的一行要将ll换成LL,但是我以前用的都是ll...编译器报错:expected initializer before long