题目描述
给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。
输入描述:
输入包括5个整数:a0、a1、p、q、k。
输出描述:
第k个数a(k)对10000的模。
示例1
输入
20 1 1 14 5
输出
8359
#include<iostream> #include<string.h> using namespace std; const int mod=10000; struct mat{ long t[2][2];//定义结构体矩阵 }; mat multi(mat x,mat y) { mat ans; memset(ans.t,0,sizeof(ans.t)); for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { for(int k=0;k<2;k++) { ans.t[i][j]+=x.t[i][k]*y.t[k][j]; ans.t[i][j]%=mod; } } } return ans; } mat pow(mat a,int n) { mat ans; for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { if(i==j)ans.t[i][j]=1; else ans.t[i][j]=0; } }//ans是一个单位阵 while(n>0) { if(n%2==1) { ans=multi(ans,a); } a=multi(a,a); n/=2; } return ans; } int main() { int a0,a1,p,q,k; while(cin>>a0>>a1>>p>>q>>k) { if(k==1)cout<<a1<<endl; else if(k==0)cout<<a0<<endl; else { mat m; m.t[0][0]=p; m.t[0][1]=q; m.t[1][0]=1; m.t[1][1]=0; m=pow(m,k-1); cout<<(a1*m.t[0][0]+a0*m.t[0][1])%mod<<endl; } } return 0; }