#include <bits/stdc++.h>
using namespace std;
const int maxn = 1E6 + 10;
typedef unsigned long long ull;
ull T, a, b, n, F[maxn] = {0, 1};
int pow_mod(ull a, ull n, ull b)
{
ull ans = 1;
while (n)
{
if (n & 1) ans = (ans * (a % b)) % b;
a = (a % b) * (a % b) % b;
n /= 2;
}
return ans;
}
void solve()
{
int i = 1;
do ++i, F[i] = (F[i - 1] + F[i - 2]) % n;
while (F[i] != F[0] || (F[i - 1] + F[i]) % n != F[1]);
cout << F[pow_mod(a, b, i)] << endl;
}
int main(int argc, char const *argv[])
{
cin >> T;
while (T--)
{
cin >> a >> b >> n;
if (a == 0 || n == 1) cout << 0 << endl;
else solve();
}
return 0;
}
当数字是极大的时候,有可能是循环
斐波那契数列由两项组成,当两项与开头的两项相同时,开始进入循环
算出他,记录循环长度i,输出pow(a,b) 摸i的结果即可