所有计算都是对n取模的,不妨设F(n) = (f(n) % m) 不难发现,当(F(n), F(n+1))重复出现时,整个序列就开始重复,所以数列的前两项为0,1,。。。。 当F(n) 再次出现0, 1...时,就代表0,1中间这一段为循环节。所以预处理mod m 的循环节里的每个数, (2 <= n <= 1000)。
/***********************************************
* Author: fisty
* Created Time: 2015/2/17 20:17:25
* File Name : uva11582.cpp
*********************************************** */
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define Debug(x) cout << #x << " " << x <<endl
#define Memset(x, a) memset(x, a, sizeof(x))
const int INF = 0x3f3f3f3f;
typedef unsigned long long ULL;
typedef pair<int, int> P;
#define FOR(i, a, b) for(int i = a;i < b; i++)
#define MAX_N 1001
ULL n, m;
int MOD;
vector<int> f[MAX_N];
void init(){
for(int i = 2;i <= 1000; i++){
int mod = i;
int a = 0, b = 1, c = (a + b) % mod;
f[i].push_back(a);
f[i].push_back(b);
f[i].push_back(c);
while(!(b == 0 && c == 1)){
a = b;
b = c;
c = (a % mod + b % mod) % mod;
f[i].push_back(c);
}
f[i].pop_back();
f[i].pop_back();
}
}
ULL quick_mod(ULL a,ULL b, int _m){
ULL ans = 1;
while(b){
if(b&1){
ans = (ans%_m) * (a%_m) % _m;
b--;
}
b /= 2;
a = (a%_m)*(a%_m)%_m;
}
return ans;
}
int main() {
//freopen("in.cpp", "r", stdin);
cin.tie(0);
ios::sync_with_stdio(false);
int t;
cin >> t;
init();
while(t--){
cin >> n >> m >> MOD;
if(MOD == 1){
cout << 0 << endl;
continue;
}
ULL _m = f[MOD].size();
ULL ans = quick_mod(n, m, _m);
cout << f[MOD][ans] << endl;
}
return 0;
}