下载的第一组数据:
P7961-1.in:
8 9 1
499488183 118995914 332316574 399234563 246850128 338768262 489466833 673193710 723933572 12759125
P7961-1.out:
789420212
在本地可以正确输出结果:
/media/c/D/Cod/I/O/Luogu ❯ g++ P7961.cpp -std=c++14 -Wall -o P7961.cpp.out && ./P7961.cpp.out < ~/Downloads/P7961_1.in
789420212
但是提交后WA:Wrong Answer.wrong answer On line 1 column 1, read 2, expected 7.
为什么呢qwq
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 40, M = 110, mod = 998244353;
ll dp[M][N][N][N], wei[M][N], C[N][N], popcnt[N];
int n, m, q;
#define low_bit(x) ((x) & (-1 * (x)))
int count(int x) {
int ret = 0;
while (x) {
x -= low_bit(x);
ret++;
}
return ret;
}
void pre() {
C[0][0] = 1;
for (int i = 1; i <= 30; 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 i = 0; i <= 100; i++) popcnt[i] = count(i);
}
int main() {
pre();
scanf("%d%d%d", &n, &m, &q);
for (int i = 0; i <= m; i++) {
wei[i][0] = 1;
scanf("%lld", &wei[i][1]);
for (int j = 2; j <= n; j++) wei[i][j] = wei[i][j - 1] * wei[i][1] % mod;
}
dp[0][0][0][0] = 1;
for (int i = 0; i <= m; i++)
for (int j = 0; j <= n; j++)
for (int k = 0; k <= q; k++)
for (int l = 0; l <= (n >> 1); l++)
for (int o = 0; o <= n - j; o++) {
dp[i + 1][j + o][k + ((o + l) & 1)][(o + l) >> 1] =
(dp[i + 1][j + o][k + ((o + l) & 1)][(o + l) >> 1] +
((dp[i][j][k][l] * wei[i][o]) % mod) * C[n - j][o] % mod) %
mod;
}
ll ans = 0;
for (int i = 0; i <= q; i++)
for (int j = 0; j <= (n >> 1); j++)
if (i + popcnt[j] <= q) ans = (ans + dp[m + 1][n][i][j]) % mod;
printf("%lld\n", ans);
return 0;
}