算法-蓝桥杯真题动态规划

选数异或

image-20250405145319333

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;

const int N = 1e5 + 10;
const int mod = 998244353;
int n, x;
int a[N];
int f[N][65]; // 表示选择到第i个数字,异或运算的值为x的

int main()
{
scanf("%d%d", &n, &x);
f[0][0] = 1;
for(int i = 1;i <= n;i ++) scanf("%d", &a[i]);
for(int i = 1;i <= n;i ++)
for(int j = 0;j <= 64;j ++)
{
f[i][j] = f[i - 1][j];
if((j ^ a[i]) <= 64)
f[i][j] = (f[i][j] + f[i - 1][j ^ a[i]]) % mod;
}
cout << f[n][x] % mod;
return 0;
}

砝码称重

image-20250405145357276