### 思路
本题是一个比较模板化的题目。
#### 一操作
考虑使用快速幂。
快速幂,只需要把 $k$ 变成二进制即可实现 $\Theta(\log k)$ 的时间复杂度。
实现方法:
```cpp
 long long qmi(long long a,long long k,long long p){
     long long res = 1;
     while (k){
         if (k & 1){
             res = (res * a) % p;
         }
         a = (a * a) %p;
         k >>= 1;
     }
     return res;
 }
 ```
### 二操作
考虑使用乘法逆元,除一个数等于乘上那个数的逆元,当 $p$ 为质数时,$x$ 的逆元为 $x^{p-2}$。
计算 $x^{p-2}$ 也可以使用快速幂。
### 三操作
考虑使用 BSGS 算法来进行计算,具体实现代码如下:
```cpp
 long long bsgs(long long a,long long b,long long p){
     unordered_map<long long,long long>mp;
     if (1 % p == b % p){
         return 0;
     }
     long long k = sqrt(p) + 1;
     for (long long i = 0,j = b % p; i < k; i ++ ){
         mp[j] = i;
         j = (long long)j * a % p;
     }
     long long t = 1 % p;
     for (long long i = 0; i < k; i ++ ){
         t = (long long)t * a % p;
     }
     for (long long i = 1,j = t; i <= k; i ++ ){
         if (mp.count(j)){
             return (long long)i * k - mp[j];
         }
         j = (long long)j * t % p;
     }
     return -1;
 }
 ```
### 最终代码
只需要把给出的那些东西合并起来即可。
```cpp
 #include <bits/stdc++.h>
 using namespace std;
 long long qmi(long long a,long long k,long long p){
     long long res = 1;
     while (k){
         if (k & 1){
             res = (res * a) % p;
         }
         a = (a * a) %p;
         k >>= 1;
     }
     return res;
 }
 long long bsgs(long long a,long long b,long long p){
     unordered_map<long long,long long>mp;
     if (1 % p == b % p){
         return 0;
     }
     long long k = sqrt(p) + 1;
     for (long long i = 0,j = b % p; i < k; i ++ ){
         mp[j] = i;
         j = (long long)j * a % p;
     }
     long long t = 1 % p;
     for (long long i = 0; i < k; i ++ ){
         t = (long long)t * a % p;
     }
     for (long long i = 1,j = t; i <= k; i ++ ){
         if (mp.count(j)){
             return (long long)i * k - mp[j];
         }
         j = (long long)j * t % p;
     }
     return -1;
 }
 int main(){
     long long n,T;
     cin >> n >> T;
     if (T == 1){
         for (long long i = 1; i <= n; i ++ ){
             long long a,b,p;
             cin >> a >> b >> p;
             cout << qmi(a,b,p) << endl;
         }
     } 
     else if (T == 2){
         for (int i = 1;  i<= n; i ++ ){
             int a,b,p;
             cin >> a >> b >> p;
             a %= p,b %= p;
             if (a == 0 && b != 0){
                 cout << "Orz, I cannot find x!" << endl;
             }
             else{
                 cout << qmi(a,p - 2,p) * b % p << endl;
             }
         }
     }
     else{
         for (long long i = 1; i <= n; i ++ ){
             long long a,b,p;
             cin >> a >> b >> p;
             if (a % p == b % p){
                 cout << 1 << endl;
                 continue;
             }
             a %= p;
             long long t = bsgs(a,b,p);
             if (a == 0 && b == 0){
                 cout << 1 << endl;
             }
             else if (a == 0 && b != 0){
                 cout << "Orz, I cannot find x!" << endl;
             }
             else{
                 if (t == -1){
                     cout << "Orz, I cannot find x!" << endl;
                 }
                 else{
                     cout << t << endl;
                 }
             }
         }
     }
     return 0;
 }
 ```