求调
查看原帖
求调
701387
xiaoliebao1115楼主2024/6/16 12:57
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 100 + 10;
const int mod = 998244353;
int n,m,k,p[55],a[55];
struct Matrix {
    int n, m;
    long long a[maxn][maxn];
    Matrix() { memset(a, 0, sizeof a); }
    Matrix(int _n, int _m) {
        n = _n;
        m = _m;
        memset(a, 0, sizeof a);
    }
    void scan() {
        cin >> n >> m;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++) cin >> a[i][j];
    }
    void print() {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) cout << a[i][j] << ' ';
            cout << endl;
        }
    }
};
Matrix mul(Matrix &a, Matrix &b) {
    Matrix res(a.n, b.m);
    for (int i = 0; i < a.n; i++)
        for (int j = 0; j < b.m; j++)
            for (int k = 0; k < a.m; k++)
                (res.a[i][j] += a.a[i][k] * b.a[k][j] % mod) %= mod;
    return res;
}
Matrix Pow(Matrix &ans ,int n)
{
    Matrix res(ans.n,ans.n);
    for(int i=0;i<res.n;i++)
    {
        res.a[i][i]=1;
    }
    while(n!=0)
    {
        if(n&1) res=mul(res,ans);
        ans=mul(ans,ans);
        n>>=1;
    }
    return res;
}
int ksm(int x,int y)
{
	int a=1,b=x;
	while(y>0)
	{
		if(y%2==1)
		{
			a=a*b;
			a=a%mod;
		}
		b=b*b;
		b=b%mod;
		y=y/2;
	}
	return a;
}
signed main() {
    cin>>n>>m>>k;
	for(int i=1;i<=m;i++) cin>>p[i];
	for(int i=0;i<=k;i++) cin>>a[i];
	Matrix anss(2*(k+1),2*(k+1)),base(1,2*(k+1));
	for(int i=0;i<2*(k+1);i++) base.a[0][i]=1;
	anss.a[0][0]=1;
	anss.a[0][k+1]=1;
	for(int i=0;i<=k;i++)
	{
		for(int j=1;j<=k;j++)
		{
			if(i==0) anss.a[i][j]=anss.a[i][j-1];
			else anss.a[i][j]=anss.a[i][j-1]+anss.a[i-1][j-1];
			anss.a[i][j]%=mod;
			anss.a[i][k+j+1]=anss.a[i][j];
		}
	}
	for(int i=k+1;i<2*(k+1);i++) anss.a[i][i]=1;
	anss=Pow(anss,n-1);
	//anss.print();
	base=mul(base,anss);
//	base.print();
	int sum=0;
	for(int i=k+1;i<2*(k+1);i++) sum+=a[i-k-1]*base.a[0][i],sum%=mod;
	int inv=ksm(sum,mod-2);
//	cout<<inv<<" "<<sum<<endl;
	Matrix ans(k+m+2,k+m+2),bs(1,k+m+2);
	ans.a[0][0]=1,bs.a[0][0]=1;
	for(int i=0;i<=k;i++)
	{
		for(int j=1;j<=k;j++)
		{
			if(i==0) ans.a[i][j]=ans.a[i][j-1];
			else ans.a[i][j]=ans.a[i][j-1]+ans.a[i-1][j-1];
			ans.a[i][j]%=mod;
		}
	}
	for(int i=k+1;i<k+m;i++) ans.a[i+1][i]=1;
	for(int i=0;i<=k;i++) ans.a[i][k+m]=inv*a[i]%mod;
	for(int i=k+1;i<=k+m;i++)ans.a[i][k+m]=p[k+m-i+1];
	ans.a[k+m][k+m+1]=ans.a[k+m+1][k+m+1]=1;
//	ans.print();
	ans=mul(ans,ans);
	
//	ans.print();
//	cout<<endl;
	ans=Pow(ans,n);
//	ans.print();
//	cout<<endl;
	bs=mul(bs,ans);
//	bs.print();
	cout<<bs.a[0][k+m+1];
    return 0;
}
2024/6/16 12:57
加载中...