题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3509;
题意:按照所给的最后一个公式推导,然后矩阵快速幂
把图中的矩阵最上面的0改成1,最后的f(n-2)转换为f(n-1)
然后就矩阵快速幂就行了
#include <set> #include <map> #include <stack> #include <queue> #include <math.h> #include <vector> #include <string> #include <utility> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <functional> using namespace std; struct Matrax{ long long m[55][55]; }ter; int m; int N; Matrax muli(Matrax a,Matrax b){ Matrax p; for(int i=0;i<N;i++) for(int j=0;j<N;j++){ p.m[i][j]=0; for(int k=0;k<N;k++){ p.m[i][j]+=a.m[i][k]*b.m[k][j]; p.m[i][j]%=m; } } return p; } Matrax quick_mod(Matrax a,long long b){ Matrax ans=ter; while(b){ if(b&1){ ans=muli(ans,a); b--; } else { b>>=1; a=muli(a,a); } } return ans; } long long quick_mod(long long a,long long b){ long long ans=1; while(b){ if(b&1){ ans=ans*a%m; b--; } b>>=1; a=a*a%m; } return ans; } long long c[55][55]; int main(){ int t; scanf("%d",&t); for(int i=0;i<55;i++) c[i][0]=1; while(t--){ long long f1,f2,a,b,n,k; cin>>f1>>f2>>a>>b>>k>>n>>m; for(int i=1;i<55;i++){ for(int j=1;j<55;j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%m; } if(n==1){ cout<<quick_mod(f1,k)<<endl; continue; } Matrax A; Matrax B; B.m[0][0]=(quick_mod(f1,k)+quick_mod(f2,k))%m; N=k+2; A.m[0][0]=1; for(int i=1;i<k+2;i++){ A.m[i][0]=(c[k][i-1]*quick_mod(a,i-1))%m*quick_mod(b,k-i+1)%m; } for(int i=1;i<k+2;i++){ for(int j=k+1;j>=0;j--){ if(i==1){ if(j==k+1) A.m[j][i]=1; else A.m[j][i]=0; } else if(i-k+j-2>=0) A.m[j][i]=c[i-1][i-k+j-2]*(quick_mod(a,i-k+j-2))%m%m*quick_mod(b,k-j+1)%m; else A.m[j][i]=0; } } for(int i=0;i<k+2;i++) for(int j=0;j<k+2;j++) ter.m[i][j]=(i==j); n-=2; A=quick_mod(A,n); for(int i=1;i<k+2;i++){ B.m[0][i]=quick_mod(f2,i-1)*quick_mod(f1,k-i+1)%m; } for(int i=1;i<k+2;i++) for(int j=0;j<k+2;j++){ B.m[i][j]=0; } B=muli(B,A); cout<<B.m[0][0]<<endl; } return 0; }