有注释

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x,y;
void exgcd(ll a,ll b)
{
    if(b==0)
    {
        x=1,y=0;
        return;
    }
    exgcd(b,a%b);
    ll cx=x,cy=y;
    x=cy; y=cx-a/b*cy;
}

inline ll qp(ll a,ll b,ll mod)
{
    a%=mod;
    ll res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;    
    }
    return res;
}

int main()
{
    int t,k;
    while(cin>>t>>k)
    {
        if(k==1)
        {
            ll a,b,p;
            while(cin>>a>>b>>p)
            {
                cout<<qp(a,b,p)<<endl;
            }
        }
        else if(k==2)
        {
            ll a,b,p;
            while(cin>>a>>b>>p)
            {
                if(b%(__gcd(a,p))!=0)   puts("Orz, I cannot find x!");
                else 
                {
                    exgcd(a,p);
                    cout<<(x*b/__gcd(a,p)%(p/(__gcd(a,p)))+p/(__gcd(a,p)))%p/(__gcd(a,p))<<endl;
                }
            }
        }
        else
        {
            //解一个这种a^x%p=z%p方程.令x=i*m-j.其中m=sqrt(p).0<=j<m.0<=i<=m.原式就成了a^(i*m)%p=b*(a^j)%p.因为求min,先把j求出即可
            unordered_map<ll,ll>hash;
            ll ans,a,b,p;
            while(cin>>a>>b>>p)
            {
                hash.clear();
                ll m=sqrt(p)+1;
                ll flag=0;
                for(ll j=0;j<m;j++) hash[b*qp(a,j,p)%p]=j;
                a=qp(a,m,p);
                if(a==0) 
                {
                    puts("Orz, I cannot find x!"); 
                    continue;
                }//仔细看看同余定理
                for(ll i=0;i<=m;i++)
                {
                    ll res=qp(a,i,p);
                    if(hash.find(res)!=hash.end())
                    {
                        ans=i*m-hash[res];
                        flag=1;
                        break;
                    }
                }
                if(flag)    cout<<ans<<endl;
                else        puts("Orz, I cannot find x!");
            }
        }    
    }
    return 0;
}