/*UVa11582 - Colossal Fibonacci Numbers! ---首先所有数都是对n取模运算的,设F[i]=f(i)%n,则当二元组(F[i],F[i]+1)重复时整个序列就会出现周期循环, ---对n取模可知最多有n种余数,而二元组合最多有n^2种,所以只需要最多打长度为n^2的表就可以找到周期T。 ---需要注意以下几点: 1)n==1时候需要特判,所有数都可以整除0 2)数据范围n<2^64,所以要用64位无符号整数来存取 */ #define _CRT_SECURE_NO_DEPRECATE #include<iostream> using namespace std; typedef unsigned long long ULL; const int maxn = 1000+10; ULL F[maxn*maxn]; ULL quick_pow_mod(ULL a,ULL n,ULL m){ if (n == 0)return 1; ULL res = 1; while (n > 0){ if (n & 1) res = res*a%m; a = (a%m)*(a%m)%m; n >>= 1; } return res; } int main(){ ULL a, b, n,t,T,i; cin >> t; while (t--){ cin >> a >> b >> n; F[0] = 0; F[1] = 1; if (n == 1){ printf("0 "); continue; } for (i = 2;i<n*n; i++){ F[i] = (F[i - 1] + F[i - 2]) % n; if (F[i] == 1 && F[i - 1] == 0)break; //找到周期 } T = i - 1; //周期 ULL id = quick_pow_mod(a, b, T); cout << F[id] << endl; } return 0; }