站外题求助
  • 板块学术版
  • 楼主251Sec
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/8/22 12:34
  • 上次更新2023/10/27 14:12:12
查看原帖
站外题求助
363415
251Sec楼主2022/8/22 12:34

给定含有 nn 个数的序列 aa,满足 a1  and  a2  and    and  an=0a_1 \; \text{and}\; a_2 \; \text{and} \; \cdots \; \text{and}\; a_n=0,且 a1+a2++an=ma_1+a_2+\cdots+a_n=m,其中 and\text{and} 代表按位与。求序列 aa 的个数,答案对 998244353998244353 取模。

对于所有数据,n,m2000n, m \leq 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;
}
2022/8/22 12:34
加载中...