网站后台怎么修改代码,wordpress和wamp,网站建设服务器租赁,6入空间网站免费观看正题
题目链接:https://www.luogu.com.cn/problem/P5675 题目大意 nnn堆石子#xff0c;第iii堆有aia_iai个。指定一些石子堆使得先手必胜并指定一个先手第一个取的位置使得先手必败#xff0c;求有多少方案数。 解题思路
根据NIMNIMNIM游戏#xff0c;只要石子数异或和…正题
题目链接:https://www.luogu.com.cn/problem/P5675 题目大意
nnn堆石子第iii堆有aia_iai个。指定一些石子堆使得先手必胜并指定一个先手第一个取的位置使得先手必败求有多少方案数。 解题思路
根据NIMNIMNIM游戏只要石子数异或和为000则先手必败。
然后我们考虑枚举指定先手先去哪一堆石头我们要选择一些石子堆使没有任何一种方法取走一些石头使得先手必败。
我们用fi,jf_{i,j}fi,j表示在不包括枚举的石头堆的情况下前iii堆石头有多少种选择方案使得其异或和为jjj。然后若强制先手选择第kkk堆石头那么方案数就是∑iak∞fn,i\sum_{ia_k}^\infty f_{n,i}iak∑∞fn,i
时间复杂度O(n3)O(n^3)O(n3) codecodecode
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N210,XJQ1e97;
int n,a[N],f[N][256],ans;
int main()
{scanf(%d,n);for(int i1;in;i)scanf(%d,a[i]);for(int k1;kn;k){f[0][0]1;for(int i1;in;i){if(ik){for(int j0;j256;j)f[i][j]f[i-1][j]; }else{for(int j0;j256;j)f[i][j](f[i-1][j]f[i-1][j^a[i]])%XJQ;}}for(int ia[k];i256;i)ans(ansf[n][i])%XJQ;}printf(%d,ans);
}