考虑图片说明 这个会稍微好求一些。我们做差分,可以得到图片说明
我们可以用矩阵快速幂的方法求出所有图片说明 ,考虑一个向量,维护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;
}