1 #include <iostream>
2 #include <map>
3 #include <cmath>
4 #include <vector>
5 #include <cstdio>
6 #include <string>
7 #include <cstring>
8 #include <algorithm>
9 using namespace std;
10 #define fir first
11 #define sec second
12 #define pb(x) push_back(x)
13 #define mem(A, X) memset(A, X, sizeof A)
14 #define REP(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
15 #define rep(i,l,u) for(int (i)=(int)(l);(i)>=(int)(u);--(i))
16 #define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e)
17
18 typedef pair<long,long> pll;
19
20
21 int T,n;
22 const int mod=1e9+7;
23 const int maxn=1e3+10;
24 typedef unsigned long long ULL;
25 ULL qsm(ULL a, ULL b, ULL mod) // 0<=a<=ULL 0<=b<=ULL
26 {
27 a=a%mod;
28 ULL res=1;
29 while(b)
30 {
31 //a=a%mod;(有时候n的值太大了会超出long long的储存,所以要先取余)
32 if(b&1)//&位运算:判断二进制最后一位是0还是1,&的运算规则为前后都是1的时候才是1;
33 res=res*a%mod;
34 b=b>>1;//相当于除以2;
35 a=a*a%mod;
36 }
37 return res;
38 }
39 ULL f[maxn*maxn+1000];
40 int main()
41 {
42 freopen("in.txt","r",stdin);
43 //while(cin>>n)
44 while(cin>>T&&T)
45 {
46 REP(kase,1,T) {
47 ULL ans;
48 ULL a,b,n;
49 cin>>a>>b>>n;
50 if(a==0||n==1) ans=0;
51 else
52 {
53
54 f[1]=1;
55 f[0]=0;
56
57 int M;
58 REP(i,2,n*n+10)
59 {
60 f[i]=(f[i-1]+f[i-2])%n;
61 if(f[i]==f[1]&&f[i-1]==f[0])
62 {
63 M=i-1;
64 break;
65 }
66 }
67 ULL t=qsm(a,b,M);
68 ans=f[t];
69 }
70 cout<<ans<<endl;
71 }
72 }
73 return 0;
74 }
75
76 /*
77 note :
78 对于循环节类的问题,只需要找到刚开始的起始项,之后找到周期,利用周期的一致性,将查询到
79 项直接进行周期M取模即可,注意f[0]是否进行了赋值,如果没有的话还需要f[0]=f[M].
80 debug : 范围比较大需要用到ull
81 re的原因有可能是因为数据类型不一致,(返回 runtime error )
82 for(int i=1;i<=(unsigned long long)100;i++)
83
84 optimize: 分析出n的范围,预处理出来,可以避免大量的查询.分析出来了所有的基本可能情况.
85 改进快速幂取模,
86 命名 进行程序变量的命名的时候,最好直接指代原来的变量例如 预处理n的时候,直接就是n就可以.
87 REP(n,2,maxn)
88 */