解析:
Fn =
[
f
n
f
n
−
2
f
n
−
3
S
n
]
\begin{bmatrix}fn & fn-2 & fn-3 & Sn\end{bmatrix}
[fnfn−2fn−3Sn]
Fn+1 =
[
f
n
+
1
f
n
f
n
−
1
S
n
+
1
]
\begin{bmatrix}fn+1 & fn & fn-1 & Sn+1\end{bmatrix}
[fn+1fnfn−1Sn+1]
因为Sn+1 =Sn +Fn
[ f n f n − 2 f n − 3 S n ] \begin{bmatrix}fn & fn-2 & fn-3 & Sn\end{bmatrix} [fnfn−2fn−3Sn] * [ 3 1 0 3 2 0 1 2 7 0 0 7 0 0 0 1 ] \begin{bmatrix}3 & 1& 0 & 3\\2 & 0 &1 & 2\\7 & 0 & 0 &7\\0 &0 & 0 & 1\end{bmatrix} ⎣⎢⎢⎡3270100001003271⎦⎥⎥⎤
= [ f n + 1 f n f n − 1 S n + 1 ] \begin{bmatrix}fn+1 & fn & fn-1 & Sn+1\end{bmatrix} [fn+1fnfn−1Sn+1]
最后等价于
[
3
2
7
9
]
\begin{bmatrix}3 &2& 7 & 9\end{bmatrix}
[3279] *
[
3
1
0
3
2
0
1
2
7
0
0
7
0
0
0
1
]
\begin{bmatrix}3 & 1& 0 & 3\\2 & 0 &1 & 2\\7 & 0 & 0 &7\\0 &0 & 0 & 1\end{bmatrix}
⎣⎢⎢⎡3270100001003271⎦⎥⎥⎤ (n-2) =
[
f
n
+
1
f
n
f
n
−
1
S
n
+
1
]
\begin{bmatrix}fn+1 & fn & fn-1 & Sn+1\end{bmatrix}
[fn+1fnfn−1Sn+1]
#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;
}