斐波那契數列卷積
theme:給定n,求an,其中an遞推式爲:
solution:首先推出an遞推式:
推出矩陣A:
下面編碼採用An-1、fn等順序不一樣,可自行推導:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
#define far(i,t,n) for(int i=t;i<n;++i)
#define pk(a) push_back(a)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int inf=0x3f3f3f3f;
int mod=998244353;
struct mat
{
ll var[10][10];
mat()
{
far(i,0,10)
far(j,0,10)
var[i][j]=0;
}
void init()
{
var[0][0]=var[0][1]=var[0][2]=1;
var[1][0]=1;
var[2][2]=var[2][3]=1;
var[3][2]=1;
}
mat operator*(mat b)const
{
mat ans;
far(i,0,4)
far(j,0,4)
{
ll sum=0;
far(k,0,4)
sum=(sum+var[i][k]*b.var[k][j]%mod)%mod;
ans.var[i][j]=sum;
}
return ans;
}
};
mat quickMatPow(mat a,ll b)
{
mat ans;
far(i,0,4)
ans.var[i][i]=1;
while(b)
{
if(b%2)
ans=ans*a;
a=a*a;
b/=2;
}
return ans;
}
int main()
{
ll n;
while(scanf("%lld",&n)!=EOF)
{
mat a;
a.init();
a=quickMatPow(a,n-1);
printf("%lld\n",a.var[0][2]);
}
}