关于NOIPT2爆零
  • 板块题目总版
  • 楼主Missa
  • 当前回复10
  • 已保存回复10
  • 发布时间2021/11/29 20:01
  • 上次更新2023/11/3 23:16:04
查看原帖
关于NOIPT2爆零
443664
Missa楼主2021/11/29 20:01

RT,但源代码在任何平台都能过啊

是不是数组开大了或其它之类玄学问题?

#include <cstdio>
#define QYX using
#define AKs namespace
#define IOI std
#define easily ;
#define p 998244353
QYX AKs IOI easily
const int M = 125;
int dp[M][M][M][M]; //place, tot_of_filling_in, end, tot_of_1(1-n) val = quanzhi
int n, m, K, v[M][M], ans, C[M][M];
void add(int &a, int b){
	a += b; if(a > p) a -= p;
}
int cal(int t){
	int ans = 0;
	for(; t; t >>= 1) ans += (t&1);
	return ans;
}
void pre(int n){
	for(int i = 0; i <= n; i++){
		C[i][0] = 1;
		for(int j = 1; j <= i; j++) add(C[i][j], C[i-1][j-1] + C[i-1][j]);
	}
}
int main(){
	//freopen("sequence.in", "r", stdin);
	//freopen("sequence.out", "w", stdout);
	scanf("%d %d %d", &n, &m, &K); pre(105);
	for(int i = 1; i <= m+1; i++){
		scanf("%d", &v[i][1]); v[i][0] = 1;
		for(int j = 1; j <= n+5; j++) v[i][j] = 1ll * v[i][j-1] * v[i][1] % p;
	}
	dp[1][0][0][0] = 1;
	for(int i = 1; i <= n; i++) dp[1][i][i][0] = v[1][i];
	for(int i = 1; i <= m; i++){ //place_to_fill
		for(int j = 0; j <= n; j++){ //tot_of_filling_in 
			for(int k = 0; k <= j; k++){ //now
				for(int l = 0; l <= j; l++){ //tot_of_1
					for(int t = 0; t <= n - j; t++){ //to
						add(dp[i+1][j+t][t+k/2][l+k%2], 1ll * C[j+t][t] * v[i+1][t] % p * dp[i][j][k][l] % p);
//						printf("%d %d %d %d -> %d %d %d %d (%d) C * v * val1 = %d * %d * %d = val2 = %d\n", i, j, k, l, i+1, j+t, t+k/2, l+k/2%2, t, C[j+k][k], v[i+1][t], dp[i][j][k][l], dp[i+1][j+t][t+k/2][l+k/2%2]);
					}
				}
			}
		}
	}
	for(int k = 0; k <= n; k++){
		for(int l = 0; l <= n; l++){
			if(l + cal(k) <= K) add(ans, dp[m+1][n][k][l]);
		}
	}
	printf("%d\n", ans);
	return 0;
} 
2021/11/29 20:01
加载中...