2022年蓝桥杯省赛C++c组真题 F题.选数异或 题型:dp

35 阅读1分钟

F题.选数异或

动态规划根本写不出来,看题解吧: image.png

#include<bits/stdc++.h>
using namespace std;
#define MOD 998244353
const int N = 1e5 + 10;
int a[N];
int dp[N][64];
int main()
{
	cin.tie(nullptr)->sync_with_stdio(false);
	int n, x; cin >> n >> x;

	for (int i = 0; i < n; i++)cin >> a[i];

	dp[0][a[0]] = dp[0][0] = 1;  //前0个数异或和为0的子序列的个数为1

	for (int i = 1; i <= n; i++)
	{
		for (int j = 0; j < 64; j++)
		{
			dp[i][j] = (dp[i - 1][j] + dp[i - 1][j ^ a[i]])%MOD;  //前i个数异或和为j的子序列的个数=包含第i个数异或和为j的子序列个数  + 不包含第i个数异或和为j的子序列个数
		}
	}

	cout << dp[n - 1][x];  //前n-1个数异或和为x的子序列的个数
	return 0;
}

image.png