题目大意:f(n) = a * f(n-1) + b * f(n-3) + c, if(n > 2)
= 0, if(n ≤ 2)
题目解析:构造矩阵 [a,1,0,0]
[0,0,1,0]
[b,0,0,0]
[c,0,0,1];初始矩阵为[0,0,0,1],最后答案是[1,1];
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#define ll unsigned long long
using namespace std;
int mod=10007;
struct mat
{
int a[5][5];
mat()
{
memset(a,0,sizeof(a));
}
};
mat multi(mat m1,mat m2)
{
int i,j,k;
mat ans=mat();
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
if(m1.a[i][j])
for(k=1;k<=4;k++)
ans.a[i][k]=(ans.a[i][k]+m1.a[i][j]*m2.a[j][k])%mod;
return ans;
}
mat fun(mat m,ll n)
{
mat ans=mat();
int i;
for(i=1;i<=4;i++)ans.a[i][i]=1;
while(n)
{
if(n&1)ans=multi(m,ans);
m=multi(m,m);
n>>=1;
}
return ans;
}
int main()
{
int cas,c,i,a,b,n,cc;
scanf("%d",&cas);
for(cc=1;cc<=cas;cc++)
{
scanf("%d%d%d%d",&n,&a,&b,&c);
mat chu=mat(),gouzao=mat();
chu.a[1][1]=0;
chu.a[1][2]=0;
chu.a[1][3]=0;
chu.a[1][4]=1;
printf("Case %d: ",cc);
if(n<=2)
printf("0\n");
else
{
gouzao.a[1][1]=a;
gouzao.a[3][1]=b;
gouzao.a[4][1]=c;
gouzao.a[1][2]=1;
gouzao.a[2][3]=1;
gouzao.a[4][4]=1;
printf("%llu\n",multi(chu,fun(gouzao,n-2)).a[1][1]);
}
}
return 0;
}