考虑 这个会稍微好求一些。我们做差分,可以得到
我们可以用矩阵快速幂的方法求出所有 ,考虑一个向量,维护Fib(i),Fib(i-1)和所有的
,矩阵共k+3维。
得到之后,我们可以展开得到关于
的表达式。
也就是
.
整体复杂度O(k^3 log(n))
也有大佬直接用BM板子过题
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll modn = 998244353; struct Mat{ ll a[105][105]; Mat(){ memset(a,0,sizeof(a));\ } ll* operator[](int i){ return a[i]; } }; int W=104; Mat operator *(Mat &a, Mat &b){ Mat ans; for(int i=0;i<W;i++)for(int j=0;j<W;j++){ for(int k=0;k<W;k++) { ans[i][j] += a[i][k] * b[k][j] % modn; } ans[i][j]%=modn; } return ans; } ll C[505][505]; ll F_b[505]; ll F[505]; ll pown[505]; Mat powmod(Mat a, ll p){ Mat ans; for(int i=0;i<W;i++)ans[i][i]=1; while(p) { if (p % 2) { ans = ans * a; } p /= 2; a = a * a; } return ans; } int main() { C[0][0]=1; for(int i=0;i<500;i++){ for(int j=0;j<=i;j++){ C[i+1][j]+=C[i][j]; C[i+1][j+1]+=C[i][j]; C[i+1][j]%=modn; C[i+1][j+1]%=modn; } } ll n,k; cin>>n>>k; pown[0]=1; for(int i=1;i<=k;i++) pown[i]=pown[i-1]*(n%modn)%modn; W=k+3; Mat ans; ans[0][0]=1; ans[0][1]=1; ans[1][0]=1; ans[2][2]=1; ans[2][0]=1; ans[2][1]=1; for(int i=1;i<=k;i++){ for(int j=0;j<=i;j++){ ans[i+2][j+2]=C[i][j]; } } ans = powmod(ans,n); for(int i=0;i<=k;i++) F_b[i]=ans[i+2][1]; F[0]=F_b[0]; for(int i=1;i<=k;i++){ ll fi = F_b[i]; ll flag = 1; for(int j=0;j<i;j++){ flag = modn-flag; fi += flag * C[i][j] %modn *pown[i-j]%modn * F[j]%modn; } fi %= modn; fi *= flag; F[i]=fi%modn; } cout<<F[k]<<endl; return 0; }