点击打开链接
Problem Description
已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5,对于给定的每个n,输出F(0)+ F(1)+ …… + F(n) mod 2009。
Input
第一行是一整数m,代表总共有m个cases。
Output
对于每个case,输出一行。格式见样例,冒号后有一个空格。
Sample Input
236
Sample Output
Case 1: 37Case 2: 313
第一次做到S(n)=S(n-1)+3*F(n-1)+2*F(n-2)+7*F(n-3),直接出现S(n)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod=2009;
struct Martix{
ll arr[5][5];
}e,st;
void init(){
memset(e.arr,0,sizeof(e.arr));
memset(st.arr,0,sizeof(st.arr));
e.arr[1][1]=e.arr[2][2]=e.arr[3][3]=e.arr[4][4]=1;
st.arr[1][1]=1,st.arr[1][2]=3,st.arr[1][3]=2,st.arr[1][4]=7;
st.arr[2][1]=0,st.arr[2][2]=3,st.arr[2][3]=2,st.arr[2][4]=7;
st.arr[3][2]=st.arr[4][3]=1;
}
Martix mul(Martix a,Martix b){
Martix ans;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
ans.arr[i][j]=0;
for(int k=1;k<=4;k++){
ans.arr[i][j]=(ans.arr[i][j]+a.arr[i][k]*b.arr[k][j])%mod;
}
}
}
return ans;
}
Martix pow(Martix st,int n){
Martix ans=e;
while(n){
if(n&1)
ans=mul(ans,st);
st=mul(st,st);
n/=2;
}
return ans;
}
int main(){
int T;
scanf("%d",&T);
for(int i=1;i<=T;i++){
int n;
scanf("%d",&n);
init();
ll ans;
if(n==0)
ans=1;
else if(n==1)
ans=4;
else{
st=pow(st,n-2);
ans=(st.arr[1][1]*9+st.arr[1][2]*5+st.arr[1][3]*3+st.arr[1][4])%mod;
}
printf("Case %d: %lld\n",i,ans%mod);
}
return 0;
}