一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一下序,从大到小求. #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #include<algorithm> #in…
学了新的忘了旧的,还活着干什么 题意:一些盒子,每步可选择打开盒子和取出已打开盒子的任意多石子,问先手是否必胜 搬运po姐的题解: 先手必胜的状态为:给出的数字集合存在一个异或和为零的非空子集,则先手必胜 证明: 首先我们有状态A:当前的所有打开的箱子中的石子数异或和为零,且所有关闭的箱子中的石子数的集合中不存在一个异或和为零的非空子集 易证A状态时先手必败 先手有两种操作: 1.从一个打开的箱子中拿走一些石子 那么根据Nim的结论 后手可以同样拿走一些石子使状态恢复为A状态 2.打开一些箱子…
题目链接 题意 : 给出 N 个数.然后问你最多取出多少石子使得在 NIM 博弈中.后手必胜 分析 :  Nim 博弈模型,后手必胜当且仅当各个堆的石子的数目的异或和为 0 转化一下.变成最少取多少石子使得异或和为原来所有石子堆的异或和 和背包DP思想很类似.可以考虑 DP dp[i][j] = 到第 i 个石子为止.使得异或和为 j 的最少取石子方案是多少 但是如果这样子去构造 dp 转移显然是 O(n^2) 的 如果你接触过 FWT 优化 DP 的题目的话.可能会想到如下的 DP 方程 dp…
LINK:Hungergame 放上一道简单题 复习一下. 考虑每次可以打开任意多个盒子 如果全打开了 那么就是一个NIM游戏了. 如果发现局面是异或为0的时候此时先手必胜了. 考虑局面不全体异或为0的情况 先手开始翻了若干个盒子. 考虑这些盒子的石头异或是否为0 因为这样是判断后手是否为当前局面NIM游戏的先手. 如果异或不为0 那么先手可以当当前所有翻开的石头的先手了. 如果接下来任意翻开的盒子下面都没有异或为0的 那么后手永远是NIM游戏的先手. 可以发现这样的局面当前仅当在这个局面中所有…
和nim游戏类似 易证必败状态为:当前打开的箱子中石子异或和为0,没打开的箱子中不存在一个子集满足异或和为0 因为先手无论是取石子还是开箱子,后手都可以通过取石子来使状态变回原状态 所以只需判定是否有子集异或和等于零即可 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; int…
正解:线性基 解题报告: 传送门! 这题其实就是个博弈论+线性基,,,而且博弈论还是最最基础的那个结论,然后线性基也是最最基础的那个板子$QwQ$ 首先做这题的话需要一点点儿博弈论的小技能,,,这题的话就是,博弈论的入门经典题,有个结论是当开局的时候所有数异或起来不等于0的时候先手必胜 这儿瞎证下趴,,,因为是入门$so$还是比较$easy$证的来着$QwQ$ 就考虑把所有数换算成二进制的 如果石子数异或和不为0,那么考虑如果先手能通过取石子数使石子数异或和为0的话,那么接下来要不就还存在石子数…
[BZOJ1299]巧克力棒(博弈论,线性基) 题面 BZOJ 题解 \(Nim\)博弈的变形形式. 显然,如果我们不考虑拿巧克力棒出来的话,这就是一个裸的\(Nim\)博弈. 但是现在可以加入巧克力棒.加入巧克力棒的意义是修改当前的异或和. 如果不能够改变当前先后手赢的状态的话,那么必定不能够拿出一个巧克力棒的集合满足异或和为\(0\). 初始情况下是先手必败的情况,因为先后不改变当前的必胜/必败情况,所以先手必须要拿出一个异或和为\(0\)的集合,并且使得剩下的部分不能够存在异或和为\(0\…
[BZOJ1299]巧克力棒 Description TBL和X用巧克力棒玩游戏.每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度.TBL先手两人轮流,无法操作的人输. 他们以最佳策略一共进行了10轮(每次一盒).你能预测胜负吗? Input 输入数据共20行. 第2i-1行一个正整数Ni,表示第i轮巧克力棒的数目. 第2i行Ni个正整数Li,j,表示第i轮巧克力棒的长度. Output 输出数据共10行. 每行输出"YES"或"NO"…
BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿走.第二回合也一样,第二个游戏者也有这样一次机会.从第…
题目链接 如果后手想要胜利,那么在后手第一次取完石子后 可以使石子数异或和为0.那所有数异或和为0的线性基长啥样呢,不知道.. 往前想,后手可以取走某些石子使得剩下石子异或和为0,那不就是存在异或和为0的子集吗. so先手要使得他取完后不存在异或和为0的子集.从大到小依次尝试插入线性基即可. //820kb 0ms #include <cstdio> #include <cctype> #include <algorithm> #define gc() getchar(…