打表代码:
#include<bits/stdc++.h>
int dp[200][2000];
int fib[1100];
int main(){
fib[0]=0;
fib[1]=1;
for(int i=2;i<=40;i++){
fib[i]=fib[i-1]+fib[i-2];
}
dp[0][0]=1;
//num是组成该数的个数
//如果j可以有num个fib数组成,那么肯定能由num-1个j-fib[i]组成
for(int num=1;num<=40;num++){
for(int i=0;i<=40;i++){
for(int j=fib[i];j<=1000;j++){
dp[num][j]+=dp[num-1][j-fib[i]];
}
}
}
for(int i=1;i<=40;i++){
for(int j=1;j<=1000;j++){
if(!dp[i][j]){
printf("%d\n",j);
break;
}
}
}
}
套用高斯消元即可得出前三项的关系。
f(n)=4*f(n-1)-4*f(n-2)+f(n-3)
矩阵快速幂即可得到最终答案:
#include<bits/stdc++.h>
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define MAXN 0x3f3f3f3f3f3f3f3f
using namespace std;
const ll MOD=998244353;
const int N=3;
struct node{
ll a[10][10];
}tmp,ans,t;
//#define debug
node matrix(node x,node y ){
node q;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
q.a[i][j]=0;
for(int k=1;k<=N;k++){
q.a[i][j]=(q.a[i][j]+x.a[i][k]*y.a[k][j]+MOD)%MOD;
}
}
}
return q;
}
void quick_ma(ll n){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
ans.a[i][j]=0;
}
}
for(int i=1;i<=N;i++) ans.a[i][i]=1;
t=tmp;
while(n){
if(n&1) ans=matrix(ans,t);
n>>=1;
t=matrix(t,t);
}
}
int main()
{
ll n;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
tmp.a[i][j]=0;
}
}
tmp.a[1][1]=4;
tmp.a[1][2]=-4;
tmp.a[1][3]=1;
tmp.a[2][1]=1;
tmp.a[3][2]=1;
while(scanf("%lld",&n)!=EOF){
if(n==1) printf("4\n");
else if(n==2) printf("12\n");
else if(n==3) printf("33\n");
else{
quick_ma(n-3);
printf("%lld\n",(ans.a[1][1]*33l%MOD+ans.a[1][2]*12l%MOD+ans.a[1][3]*4l%MOD)%MOD);
}
}
return 0;
}