(1)这道题要用到 unsigned long long, 弄了我好久
这道题范围可以达到2的64次方-1, 而long long 最多到2的63次方-1,
而unsigned long long可以到2的64次方-1,所以要用这个类型,注意这个类型只有正数
输入输出用printf貌似要用%llu, 我直接用cin cout方便一些
(2)这道题因为是去模的, 所以我们可以找规律, 可以发现斐波那契数列这样
一直取模是肯定会重复的,所以我们可以找到一个周期。所以我们就判断a的b次方
在这个周期中的哪一个位置, 就可以得出答案了
#include#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;typedef unsigned long long ull;const int MAXN = 1123;int f[MAXN][MAXN*6], period[MAXN], T;int cal(ull a, ull b, int p){ int ret = 1; while(b) { if(b & 1) ret = ret * a % p; b >>= 1; a = a * a % p; } return ret;}int solve(ull a, ull b, int p){ if(a == 0 || p == 1) return 0; //注意特殊情况 int t = cal(a % period[p], b, period[p]); //注意这里要取模 return f[p][t];}void init() //预处理 { REP(p, 2, 1001) { f[p][0] = 0; f[p][1] = 1; for(int i = 2; ; i++) { f[p][i] = (f[p][i-1] + f[p][i-2]) % p; if(f[p][i-1] == 0 && f[p][i] == 1) // 看是否重复 { period[p] = i - 1; break; } } }}int main(){ init(); cin >> T; while(T--) { ull a, b; int p; cin >> a >> b >> p; cout << solve(a, b, p) << endl; } return 0;}