题目链接

https://www.acwing.com/problem/content/description/896/

思路

注意题意是:从这么多堆中拿走一堆,然后加上两堆较小(不一定相同)的石子那么最后一定是能将所有的石子全部变为0的,这也是该游戏的必败态
对于每一个数量不同的石子我们就可以将其看作为一个SGSGSG局面,对于每一个局面我们可以将其分成两个小于当前局面的局面,假设当前局面数量为x,那么SG(X)=SG(i)SG(j)SG(X) = SG(i) ^ SG(j)SG(X)=SG(i)SG(j)其中iii和jjj都是小于XXX的,那么我们直接对于当前的局面枚举一下可能存在的局面就好啦,然后将初始局面的SG值全部异或起来,如果为0那么说明先手必败,否则先手必胜

代码

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3fint dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};ll ksm(ll a,ll b) {ll ans = 1;for(;b;b>>=1LL) {if(b & 1) ans = ans * a % mod;a = a * a % mod;}return ans;
}ll lowbit(ll x){return -x & x;}const int N = 2e6+10;
//----------------自定义部分----------------
int t,n,m,q,a[N],f[N];
int sg(int x){if(f[x] != -1) return f[x];unordered_map<int,bool> vis;for(int i = 0;i < x; ++i) {for(int j = 0;j <= i; ++j) {vis[sg(i)^sg(j)] = true;}}for(int i = 0;;i++){if(!vis[i])return f[x] = i;}
}
void slove(){cin>>n;int x,res = 0;memset(f,-1,sizeof f);for(int i = 0;i < n; ++i) {cin>>x;res ^= sg(x);}if(res) cout<<"Yes"<<endl;else cout<<"No"<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);t = 1;while(t--){slove();}return 0;
}

AcWing 894. 拆分-Nim游戏相关推荐

  1. AcWing 893. 集合-Nim游戏(SG函数)

    题目链接 https://www.acwing.com/problem/content/895/ 思路 因为博弈的过程是一个状态交替的过程,而SG函数就是记录每一个状态交替的过程,从终点的必败态往前推 ...

  2. AcWing 892. 台阶-Nim游戏(nim博弈变种)

    题目链接 https://www.acwing.com/problem/content/description/894/ 思路 先说结论:我们将奇数位置上的石子数异或起来如果不为0则先手必胜 原理: ...

  3. 【模板题】几种常见的Nim游戏(博弈论)

    一.AcWing 891. Nim游戏 [题目描述] 给定nnn堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败. 问如果 ...

  4. [博弈论] Nim游戏及SG函数(经典+台阶+集合+拆分)

    文章目录 0. 前言 1. Nim 游戏+模板题 2. 台阶 - Nim 游戏+变种题 3. Mex运算与SG函数 4. 集合 - Nim 游戏+变种题 5. 拆分 - Nim 游戏+变种题 0. 前 ...

  5. 博弈论(Nim游戏、有向图游戏之SG函数)

    这里写目录标题 经典NIM游戏 Nim游戏属于公平组合游戏ICG 有向图游戏(SG函数) Mex运算 SG函数 单个有向图(一堆石子) 求SG值(记忆化递归) 有向图游戏的和 ,(多个有向图(多堆石子 ...

  6. acwing——数学知识(四)Nim游戏

    一.经典Nim游戏 题目:给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败. 问如果两人都采用最优策略,先手是否必胜 ...

  7. Nim游戏入门+SG函数

    对于经典的Nim游戏,只需要把每一堆初始状态都异或起来,最后得到的结果非0的为必胜状态,结果为0的为必败状态. 原理:异或的结果非0的状态总能通过一次取物品操作,将此状态转化为结果为0的状态:而异或结 ...

  8. 【bzoj3150】 cqoi2013—新Nim游戏

    www.lydsy.com/JudgeOnline/problem.php?id=3105 (题目链接) 题意 在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿 ...

  9. LeetCode实战:Nim 游戏

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 You are pla ...

最新文章

  1. 仅用几行Python代码就能帮小姐姐复制U盘文件,实用干货
  2. 利用Apache ab以及GNUPlot来进行Web测试
  3. python 难度-Python 入门的难度
  4. Windoes 10 笔记本上安装telnet方法
  5. UIDevice通知,键盘通知
  6. Java编码规范,在您进行编码之前应该阅读的规范
  7. 计算机表演赛新疆赛区,【图】第二十六届中国儿童青少年威盛中国芯HTC计算机表演赛“中国电信天翼杯”新疆赛区总决赛圆满结束_乌鲁木齐教育信息网...
  8. codevs 1907 方格取数 3
  9. asp.net的常用控件
  10. python设计思路怎么写_初中信息技术 初识Python教学设计
  11. C++ Primer 读书笔记 - 第二章
  12. 【LeetCode】【数组】题号:*498,对角线遍历
  13. 为什么写网页用php,php能写网页吗
  14. Linux之nmap扫描多网段
  15. 支持向量机(SVM)原理小结(3)支持向量回归SVR
  16. c语言银行卡六位密码编译,6位随机密码生成器
  17. Django实现adminx后台网站访问的IP记录统计
  18. java web 登录_javaWeb实现登录功能
  19. linux/android系统的USB gadget configfs用户空间配置USB HID U盘 adb dcd等模式的使用
  20. 360打响数字安全第一枪?免费

热门文章

  1. Matlab之通用特殊矩阵函数
  2. 批量ping IP并检测IP延迟率和丢包率脚本
  3. Django学习笔记5-url
  4. shiro框架的使用
  5. CodeForces 489A SwapSort (选择排序法)
  6. Linux系统下如何设置IP地址?
  7. DS博客作业02--线性表
  8. isinstance / issubclass / type, 方法和函数, 反射
  9. python 黑客书籍 ——扫描+暴力破解
  10. 实现文本超出显示省略号