1 条题解

  • -1
    @ 2025-10-18 13:57:43

    0分做法

    1. 不取模即可

    2. 不开 long long

    3. 不使用 freopen 即可。

    80分做法

    数组开小即可。

    满分做法

    设计 dpi,j,l,xdp_{i,j,l,x} 表示在 SS00ii 位中,给 jj{ai}\{a_i \} 中元素赋了值,SS 中到现在为止有 ll11,第 ii 位相当于加了 xx 次(包括 [0,i1][0,i-1] 进上去的)。

    现在考虑如何转移。枚举上一次用的 yy,然后就比较显然了。

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int mod=998244353;
    int n,m,k,v[105][35],ans;
    int dp[110][35][35][35],C[35][35];
    signed main() {
    	std::ios::sync_with_stdio(0),cin.tie(0);
    	cin>>n>>m>>k;
    	for(int i=0; i<=m; ++i) {
    		v[i][0]=1;
    		cin>>v[i][1];
    		for(int j=2; j<=n; ++j) v[i][j]=v[i][j-1]*v[i][1]%mod;
    	}
    	C[0][0]=1;
    	for(int i=1; i<=n; ++i) {
    		C[i][0]=1;
    		for(int j=1; j<=i; ++j) {
    			C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
    		}
    	}
    	for(int j=0; j<=n; ++j) {
    		dp[0][j][j%2][j]=v[0][j];
    	}
    	for(int i=1; i<=m; ++i) {
    		for(int j=0; j<=n; ++j) {
    			for(int l=0; l<=j; ++l) {
    				for(int y=0; y<=j; ++y) {
    					if(!dp[i-1][j][l][y])continue;
    					for(int x=0; x+j<=n; ++x) {
    						dp[i][j+x][l+(x+y/2)%2][x+y/2]=(dp[i][j+x][l+(x+y/2)%2][x+y/2]+dp[i-1][j][l][y]*v[i][x]%mod*C[j+x][x]%mod)%mod;
    					}
    				}
    			}
    		}
    	}
    	for(int l=0; l<=k; ++l) {
    		for(int x=0; x<=n; ++x) {
    			if(l+__builtin_popcount(x)-x%2<=k)
    				ans=(ans+dp[m][n][l][x])%mod;
    		}
    	}
    	cout<<ans<<"\n";
    	return 0;
    }
    
    • @ 2025-10-18 14:26:28

      好的,已完成 00 分做法大学习。

  • 1

信息

ID
475
时间
1000ms
内存
256MiB
难度
10
标签
(无)
递交数
6
已通过
2
上传者