给定含有 n 个数的序列 a,满足 a1anda2and⋯andan=0,且 a1+a2+⋯+an=m,其中 and 代表按位与。求序列 a 的个数,答案对 998244353 取模。
对于所有数据,n,m≤2000。
我写了个暴力DP,显然TLE:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int p = 998244353;
ll a[2005][2005][2];
int m, n;
int main() {
freopen("math.in", "r", stdin);
freopen("math.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 0; i <= m; i++) {
a[i][i][1] = 1;
}
for (int q = 2; q <= n; q++) {
for (int i = 0; i <= m; i++) {
for (int j = m; j >= 0; j--) {
a[i][j][q % 2] = 0;
if (!a[i][j][(q + 1) % 2]) continue;
for (int k = 0; k + j <= m; k++) {
a[i & k][j + k][q % 2] += a[i][j][(q + 1) % 2];
a[i & k][j + k][q % 2] %= p;
}
}
}
}
printf("%lld", a[0][m][n % 2]);
return 0;
}