Codeforces 题目传送门 & 洛谷题目传送门 首先看到这样的题我们不妨从最特殊的情况入手,再逐渐推广到一般的情况.考虑如果没有特殊点的情况,我们将每个可能的局面看作一个点 \((a,b)\) 并映射到坐标系上.考虑按照博弈论的套路求出每个点是必胜点还是必输点,就这题而言,显然一个点 \((x,y)\) 是必胜点当且仅当 \(\exists z<x\) 满足 \((z,y)\) 是必胜点或者 \(\exists z<y\) 满足 \((y,z)\) 是必胜点.打个表 即可知道一个…
[HDU3032]Nim or not Nim?(博弈论) 题面 HDU 题解 \(Multi-SG\)模板题 #include<iostream> #include<cstdio> using namespace std; inline int read() { int x=0;bool t=false;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-'…
Alice and Bob are playing a game with nn piles of stones. It is guaranteed that nn is an even number. The ii-th pile has aiai stones. Alice and Bob will play a game alternating turns with Alice going first. On a player's turn, they must choose exactl…
一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一下序,从大到小求. #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #include<algorithm> #in…
DescriptionNim is a 2-player game featuring several piles of stones. Players alternate turns, and on his/her turn, a player’s move consists of removing one or more stones from any single pile. Play ends when all the stones have been removed, at which…
题目链接 \(Description\) 有多堆石子, 每次可以将任意一堆拿走任意个或者将这一堆分成非空的两堆, 拿走最后一颗石子的人胜利.问谁会获得胜利. \(Solution\) Lasker's Nim游戏 具体见这 这个问题可以用SG函数来解决. 首先,操作(1)和Nim游戏没什么区别,对于一个石子数为k的点来说,后继可以为0-k-1. 而操作(2)实际上是把一个游戏分成了两个游戏,这两个游戏的和为两个子游戏的SG函数值的异或. 而求某一个点的SG函数要利用它的后继,它的后继就应该为 当…
传送门 题意简述:m个石子,有两个队每队n个人循环取,每个人每次取石子有数量限制,取最后一块的输,问先手能否获胜. 博弈论+dp. 我们令f[i][j]f[i][j]f[i][j]表示当前第i个人取石子,石子还剩下j个时能否获胜. 显然如果有取法让轮到第(i+1)(i+1)(i+1) modmodmod 2n2n2n 个人有必败状态,那么的当前就是必胜状态. 再令k=(i+1)k=(i+1)k=(i+1) modmodmod 2n2n2n 于是f[i][j]=f[k][j−1]∣f[k][j−2…
[题目链接] http://poj.org/problem?id=2975 [题目大意] 问在传统的nim游戏中先手必胜策略的数量 [题解] 设sg=a1^a1^a3^a4^………^an,当sg为0时为必败态, 因此先手只需改变一个aj,让其减少m,使得sg^aj^(aj-m)=0即可让对手处于必败态, 即先手必胜策略,因为异或为0的两个数相同,所以sg^aj=aj-m, 即m=aj-sg^aj,因为m大于0,所以aj>sg^aj,至此我们就得到了必胜策略的重要条件 [代码] #include…
[题目链接] http://codeforces.com/problemset/problem/786/A [题目大意] 有两个人,每个人有一个数集,里面有一些数,现在有一个环,有个棋子放在1, 有个不确定位置的终点,两个人轮流从自己的数集中选择一个数,作为这个棋子移动的步数 问终点在不同位置,不同人先手的时候谁能赢,或者游戏陷入循环 [题解] 我们从st_0_0=st_1_0=0开始倒着推导, 如果一个状态是必败态,那么它的前继节点一定是必胜态 如果一个点的所有后继都是必胜态,那么这个节点一定…
class Solution {public:    bool canWinNim(int n) {        return n % 4 != 0;    }};…