95pts Wa on 4 求助
查看原帖
95pts Wa on 4 求助
637796
Xy_top楼主2024/11/23 22:26
#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int n, m, k;
int f[110][40][40][40];//2e6
int v[110], p[110][40];
int c[35][35];
const int mod = 998244353;
int func (int x) {//求 x 中 1 的个数
	bool f1 = x & 1, f2 = x & 2, f3 = x & 4, f4 = x & 8, f5 = x & 16;
	return f1 + f2 + f3 + f4 + f5;
}
void modify (int &x, int y) {x = (x + y) % mod;}
void solve () {
	For (i, 0, 30) c[i][0] = 1;
	For (i, 1, 30) For (j, 1, i) c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
	cin >> n >> m >> k;
	For (i, 1, m + 1) cin >> v[i];
	For (i, 1, m + 1) {
		p[i][0] = 1;
		For (j, 1, 30) p[i][j] = p[i][j - 1] * v[i] % mod;
	}
	f[0][0][0][0] = 1;
	For (i, 0, m) {
		For (j, 0, n) {
			For (k, 0, 38) {
				For (l, 0, n - 1) {
					//钦定第 i 个二进制位选几个
					if (f[i][j][k][l] == 0) continue;
					For (u, 0, n - j) {
						modify (f[i + 1][j + u][k / 2 + u][l - func (k) + (k & 1) + func (k / 2 + u)], c[n - j][u] * f[i][j][k][l] % mod * p[i + 1][u] % mod);
					}
				}
			}
		}
	}
	int ans = 0;
	For (l, 0, 31) For (p, 0, k) ans = (ans + f[m + 1][n][l][p]) % mod;
	cout << ans;
}
signed main () {
	int _ = 1;
//	cin >> _;
	while (_ --) {
		solve ();
		cout << '\n';
	}
	return 0;
}
/*
钦定从 1 到 m 选择每个 ai
每个数最多会有 n 个,那么就是说选择一个数最多影响 5 位二进制位

f_{i, j, k, l} 为前 i 个二进制位,目前选择了 j 个数,从第 i 位到往前的 5 位为 xxxxx,当前有 l 个 "1" 的方案的 v 乘积和

1 * 30

16 + 8 + 4 + 2

11110
*/
2024/11/23 22:26
加载中...