很久很久没有做递推题目了,就是简单的递推,不是很难的,不知道怎么了,最近头脑爆发,感觉递推很顺手了,就连老师说曾经说有点难读的递推都过了,很久前我是过不了的,兮兮,脑袋变的好使了
递推公式:
f[n][0] = 2 × f[n-1][0] + f[n-1][1] + f[n-1][2];
f[n][1] = 2 × f[n-1][1] + f[n-1][0] + f[n-1][3];
f[n][2] = 2 × f[n-1][2] + f[n-1][0] + f[n-1][3];
f[n][3] = 2 × f[n-1][3] + f[n-1][1] + f[n-1][2];
#include<iostream>
using namespace std;
struct Matrix
{
int ans[4][4];
}mat,e;
Matrix Matrix_mul(Matrix a,Matrix b) //两矩阵相乘
{
Matrix c;
int i,j,k;
memset(c.ans,0,sizeof(c.ans));
for(i=0;i<4;i++)
{
for(k=0;k<4;k++)
{
if(a.ans[i][k]==0) continue;
for(j=0;j<4;j++)
{
c.ans[i][j] += (a.ans[i][k]*b.ans[k][j])%100;
c.ans[i][j]%=100;
}
}
}
return c;
}
int Matrix_pow(Matrix a,__int64 n)//a^n
{
Matrix t=e;
while(n>0)
{
if(1&n) t=Matrix_mul(t,a);
a=Matrix_mul(a,a);
n>>=1;
}
//return t;
//return f_1*t.ans[0][1]+f_2*t.ans[1][1]+f_3*t.ans[2][1];
return (t.ans[0][1]+2*t.ans[1][1]+t.ans[2][1])%100;
}
void inti()
{
int i;
mat.ans[0][1]=mat.ans[0][3]=mat.ans[1][0]=mat.ans[1][2]
=mat.ans[2][1]=mat.ans[2][3]=mat.ans[3][0]=mat.ans[3][2]=1;
mat.ans[0][2]=mat.ans[1][3]=mat.ans[2][0]=mat.ans[3][1]=0;
//imat.ans=mat.ans;
for(i=0;i<4;i++)
{
mat.ans[i][i]=2;
e.ans[i][i]=1;//单位矩阵
}
}
int main()
{
int t,icase;
__int64 n;
while(scanf("%d",&t)!=EOF&&t!=0)
{
inti();
icase=1;
while(t--)
{
scanf("%I64d",&n);
printf("Case %d: %d\n",icase++,Matrix_pow(mat,n-1));
}
putchar('\n');
}
return 0;
}