解析:
Fn =
Fn+1 =
因爲Sn+1 =Sn +Fn
*
=
最後等價於
* (n-2) =
#include<iostream>
#include<cstring>
using namespace std;
const int mod=2009;
struct lxw
{
int res[4][4];
}node,base;
lxw multi(lxw a,lxw b)
{
lxw tmp;
memset(tmp.res,0,sizeof(tmp.res));
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
for(int k=0;k<4;k++)
tmp.res[i][j]+=(a.res[i][k]%mod*b.res[k][j]%mod)%mod;
return tmp;
}
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int x;
cin>>x;
if(x==0)
{
printf("Case %d: 1\n",i+1);
continue;
}
else if(x==1)
{
printf("Case %d: 4\n",i+1);
continue;
}
else if(x==2)
{
printf("Case %d: 9\n",i+1);
continue;
}
memset(node.res,0,sizeof(node.res));
memset(base.res,0,sizeof(base.res));
node.res[0][0]=5;node.res[0][1]=3;node.res[0][2]=1;node.res[0][3]=9;
base.res[0][0]=3;base.res[0][1]=1;base.res[0][3]=3;
base.res[1][2]=base.res[3][3]=1;
base.res[1][0]=base.res[1][3]=2;
base.res[2][0]=base.res[2][3]=7;
int n=x-2;
while(n)
{
if(n&1)
node=multi(node,base);
base=multi(base,base);
n>>=1;
}
printf("Case %d: %d\n",i+1,(node.res[0][3]%mod));
}
return 0;
}