题解:P13587 [NWRRC 2023] Game of Nim
Mysterious__Bird · · 题解
题意
经典的 NIM 游戏,由于题中已经给出 NIM 游戏的解法这里不过多赘述。我们要做的就是求出让各个堆的石子数异或和为
思路
声明:在下文中
我们可以很容易得到一个数按位异或他自己等于
我们可以将问题分为两步解决。
第一步
考虑将一个正整数
我们要求的答案就是:
第二步
考虑在第一步分完的情况下所有堆的石子数的异或和为
我们还可以利用滚动数组进行优化,让
我们要求的答案就是:
当然,别忘了对每次的计算结果取模,最后附上 AC 代码。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 512;
int dp[N][N];
int main(){
int n, p, m;
cin >> n >> p >> m;
int x = n-p;
dp[0][0] = 1;
for(int i=1;i<=x;i++){
for(int j=i;j<=x;j++){
for(int k=0;k<N;k++){
dp[j][k] = (dp[j][k] + dp[j-i][k^i]) % m;
}
}
}
cout << dp[x][p];
return 0;
}