题意:你的任务是计算f(a^b)除以n的余数。其中f(0)=f(1)=1,且对于所有非负整数i,f(i+2)=f(i+1)+f(i)。
思路:
由于是模运算,因此整个序列肯定会出现重复序列,所以先找出周期,在利用快速幂求出a^b,
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <map> #include <vector> using namespace std; typedef long long ll; typedef unsigned long long ull; const int N = 1000; int F[N*N+5]; int n; int T; void fin_mod() { F[0] = 0; F[1] = 1%n; for(int i = 2;;i++) { F[i] = (F[i-1] + F[i-2])%n; if(F[i] == F[1] && F[i-1] == F[0]) { T = i - 1; break; } } } int pow_mod(ull x,ull n,int mod) { if(n==0) return 1%mod; int ret=pow_mod(x,n/2,mod); ret=ret*ret%mod; if(n&1) return ret*x%mod; else return ret; } int main() { ull a,b; int t; scanf("%d",&t); while(t--) { cin>>a>>b>>n; fin_mod(); int tt = pow_mod(a%T,b,T); printf("%d ",F[tt]); } return 0; }