样例过了,把一个数据下载下来本地运行可过(500ms),为什么交上去就T了?
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll v[105], vv[105][35], f[105][35][35][20], c[40][40];
ll ans;
const int mod = 998244353;
int calc(int n) {
for(int i = 0; i <= n; i++) c[i][0] = 1;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= i; j++) c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}
}
int main() {
calc(30);
int n, m, kk;
scanf("%d %d %d", &n, &m, &kk);
for(int i = 0; i <= m; i++) {
scanf("%lld", &v[i]);
vv[i][0] = 1;
for(int j = 1; j <= n; j++) vv[i][j] = vv[i][j - 1] * v[i] % mod;
}
f[0][0][0][0] = 1;
for(int i = 0; i <= m; i++) {
for(int j = 0; j <= n; j++) {
for(int k = 0; k <= kk; k++) {
for(int p = 0; p <= j >> 1; p++) {
for(int t = 0; t <= n - j; t++) {
f[i + 1][j + t][k + (t + p & 1)][t + p >> 1] = (f[i + 1][j + t][k + (t + p & 1)][t + p >> 1] + f[i][j][k][p] * vv[i][t] % mod * c[n - j][t] % mod) % mod;
}
}
}
}
}
for(int k = 0; k <= kk; k++) for(int p = 0; p <= n >> 1; p++) {
if(k + __builtin_popcount(p) <= kk) ans = (ans + f[m + 1][n][k][p]) % mod;
}
cout << ans << endl;
return 0;
}