一个关于SG的博弈游戏,对于某个堆有$M_i$和$L_i$,那么这个堆的SG值为

$$SG_i = M_i \%(L_i+1)$$

为什么这道题的$SG$函数就是这样子的呢?四个字:手算打表!!

$Let's \quad Review \quad The \quad Defination \quad Of \quad \quad SG \quad Function!!$

定义$SG(x)=mex(S)$,其中$S$是$x$的后继状态的$SG$函数值集合,$mex(S)$表示不在$S$内的最小非负的整数。

我们先取$L=5$来看一下

当$M=1$时,由于$1$的后继状态只有$0$,由sg定义可得$sg[1] =mex\{sg[0]\}=1$

,当$M=2$时,$2$的后继状态有$0,1$得到$sg[2]= mex\{sg[0],sg[1]\}=2$

当$M=3$时,$3$的后继状态有$0,1,2$有$sg[3] = mex\{sg[0],sg[1],sg[2]\}= mex\{0,1,2\}=3$

$……$

当$M=5$时,$5$的后继状态有$0,1,2,3,4$,有$sg[5]=5$

当$M=6$时,$6$的后继状态有$1,2,3,4,5$有$sg[6]=mex\{sg[1],sg[2]……sg[5]\}=0$

当$M=7$时,$7$的后继状态有$2,3,4,5,6$有$sg[7]=mex\{sg[2],sg[3],sg[4]……sg[6]\}=1$

如此一来 规律就好明显的有木有><.

最后贴上AC代码:

#include <iostream>
#include <cstdio>
using namespace std; int main() {
int m,l,n,sg,cas;
cin>>cas;
while(cas--){
sg = 0;
cin>>n;
while(n--) {
cin>>m>>l;
sg ^= m%(l+1);
}
if(!sg) puts("Yes");
else puts("No");
}
return 0;
}

最新文章

  1. FireBird.conf配置文件常用参数
  2. out与ref的区别
  3. JavaScript学习09 函数本质及Function对象深入探索
  4. 轻量级IOC框架SwiftSuspenders
  5. Python 迭代dict 效率
  6. 设计模式之美:Abstract Factory(抽象工厂)
  7. ionic+angular+cordova 安卓环境搭建
  8. [前端]npm安装慢,换用淘宝的镜像
  9. C#中this的 四种 用法
  10. java.lang.NoSuchMethodError: 属于jar包冲突
  11. Leetcode#90 Subsets II
  12. DIV CSS阴影
  13. 将Asp.Net MVC应用程序的控制器定义在单独的程序集(类库)中
  14. MySQL基本查询语句
  15. 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 三 Linux磁盘与文件系统管理
  16. Centos7yum安装Redis详细教程
  17. Java的栈和队列
  18. JS AJAX 跨域
  19. PAT B1023
  20. luasocket 安装记录 (FS1.6)

热门文章

  1. PHP:现有图片验证码类
  2. CODE【VS】3160 最长公共子串 (后缀自动机)
  3. [java基础原理] 数字类型原理
  4. 使用idea搭建ssh项目
  5. A Small Definition of Big Data
  6. BestCoder Round #29 GTY&#39;s gay friends
  7. MySQL:记录的增删改查、单表查询、约束条件、多表查询、连表、子查询、pymysql模块、MySQL内置功能
  8. intent使用Serializable传递对象
  9. 用jQuery向div中添加Html文本内容
  10. 转 POJ分类