[JZOJ4024] [佛山市选2015] 石子游戏 解题报告
Description
(1)移去整堆石子
(2)假设石子堆中有X颗石子,取出Y颗石子,其中1<=Y,(Y,X)=1
游戏结束的条件是:取出最后一颗石子的人胜出。众所周知,Alice和Bob都是绝顶聪明的,假设他们在游戏中都采取最优的策略,问最后谁会胜出游戏呢?
Alice先取。
Input
接下来T组测试数据,在每组数据中,第一行包含一个整数N,表示有多少堆石子。第二行N个正整数,分别表示每堆有多少颗石子。
Output
Sample Input
3
3
3 5 6
4
2 3 6 9
5
3 2 1 1000000 999999
Sample Output
Alice
Bob
Alice
Data Constraint
100%的数据,T<=100,N<=100,每堆石子数量不大于1,000,000
题目大意就不解释了
考虑构造这个游戏的SG函数
SGi = mex ( { SGi }( i, j )=1 ∪ { 0 } ) 其中 mex 表示集合中最小没有出现过的自然数
为什么是这样的呢?我们联想到传统的取石子游戏,并且由于(Y,X)是互质的,(X,X-Y)也是互质的。i=X,j=X-Y
下面我们讨论这个SG函数的性质:
首先 SG0 = 0(终止态)。
若 i 是质数,那么对于小于 i 的所有正整数都可以被取到,那么 SGi则应为之前出现过的所有 SG 值中最大者+1,我们不难发现质数们的 SG 值是递增的。
若 i 是一个合数,那么 i 肯定存在某个因子为前面出现过的质数,于是 SGi 最多为该质因子的 SG 值。又有质数们的 SG 值是递增的,那么 SGi 就应为最小质因子的 SG 值了。
我们发现合数必定不能产生新的 SG 值,它必定为其某个质因子的 SG 值。 于是第 k 个质数的 SG 值就是 k+1 了。 类似线性筛质数的原理,我们可以线性筛出 SG 值了。
下面讲解分石子问题:
NIM问题是博弈论经典问题,一个典型的组合游戏问题,很多游戏问题都可以规约到Nim游戏问题。Nim游戏问题是一个ICG(Impartial Combinatorial Games)问题;
ICG问题的特征是:
1.两个人参与,交替走棋;
2.可能的走法在一个有限的集合里选取;
3.游戏局面无后效性,未来与过去无关;
4.如果某选手无法走动,则判负;
Nim的理论
游戏状态只分两种:当前先手必胜,当前先手必败;前者称为N位置,后者称为P位置;
更为严谨的定义是:
终止状态是P位置;
能够移动到P位置的状态时N位置;
只能到N位置的状态时P位置;
简单地说,就是在这个博弈中,给定n堆物品,第i堆物品有Ai个。两名玩家同时行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者胜利。两人都采取最优策略,问先手能否必胜
定理:
NIM博弈先手必胜,并且仅当A1 xor A2 xor ... xor An!=0
证明:
所有的物品都被取光是一个必败局面(对方取走了最后一个物品,已经取得胜利),此时显然有A1 xor A2 xor ... xor An=0。
对于任意一个局面,若A1 xor A2 xor ... xor An = x != 0。设x的二进制最高位的1在k位,那么至少存在一堆石子Ai,它的第k位是1。显然Ai xor x < Ai,我们就从Ai堆中取走若干个石子,让它变成Ai xor x,就得到了一个各堆石子异或起来等于0的局面。
对于任意一个局面,如果A1 xor A2 xor ... xor An=0,那么无论如何取石子,得到的局面下各堆石子异或起来都不为0.可用反证法证明,假设Ai被取成了Ai0,并且A1 xor A2 xor ... xor Ai0 xor ... xor An = 0,由异或运算的消去律得Ai0=Ai,与“不能不取石子矛盾”
综上所述,再有数学归纳法可知,A1 xor A2 xor ... xor Ai0 xor ... xor An !=0,为必胜局面,一定存在必胜一种行动让对手陷入各堆石子都异或成0的情况。而在必败局面里,无论什么行动,都会让对手陷入各堆石子都异或成不为0的情况的必胜局面。
证毕
#include<cstdio>
using namespace std; int p[],f[],SG[];
int num,n,ass,t;
void get(){
for (int i=; i<; i++){
if(!f[i]) p[++num]=i,SG[i]=num+;
for (int j=; j<=num && (j== || i%(p[j-])) && p[j]*i<; j++)
f[p[j]*i]=-,SG[p[j]*i]=j+;
}
} int main()
{
SG[]=;
get();
scanf("%d",&t);
for(int i=; i<=t; i++,ass=)
{
int j;
scanf("%d",&j);
for(;j;j--)
{
int x;
scanf("%d",&x);
ass^=SG[x];
}
printf(ass?"Alice\n":"Bob\n");
}
}
[JZOJ4024] [佛山市选2015] 石子游戏 解题报告的更多相关文章
- 洛谷 P2197 【模板】nim游戏 解题报告
P2197 [模板]nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以 ...
- 洛谷 P4301 [CQOI2013]新Nim游戏 解题报告
P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴. ...
- 洛谷 P4279 [SHOI2008]小约翰的游戏 解题报告
P4279 [SHOI2008]小约翰的游戏 题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有\(n\)堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子 ...
- 洛谷 P1199 三国游戏 解题报告
P1199 三国游戏 题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有\(N\)位武将(\(N\)为 ...
- NOIP2008 普及组T3 传球游戏 解题报告-S.B.S.
题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...
- SDOI2017 BZOJ 4820 硬币游戏 解题报告
写在前面 此题网上存在大量题解,但本人太菜了,看了不下10篇均未看懂,只好自己冷静分析了.本文将严格详细地论述算法(避免一切意会和玄学),因此可能会比其它题解更加理论化一些,希望能对像我一样看了其它题 ...
- 洛谷 P4705 玩游戏 解题报告
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
- [HEOI2016/TJOI2016]游戏 解题报告
[HEOI2016/TJOI2016]游戏 看起来就是个二分图匹配啊 最大化匹配是在最大化边数,那么一条边就代表选中一个坐标内的点 但是每一行不一定只会有一个匹配 于是把点拆开,按照'#'划分一下就好 ...
- 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告
P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...
随机推荐
- Unity学习笔记 之 发射小球碰撞物体的代码记录
绑定在摄像机上的脚本 using UnityEngine; using System.Collections; public class abc : MonoBehaviour { //设置移动速度 ...
- android选择图片或拍照图片上传到server(包含上传參数)
在9ria论坛看到的.还没測试,先Mark与大家分享一下. 近期要搞一个项目,须要上传相冊和拍照的图片.不负所望,最终完毕了! 只是须要说明一下,事实上网上非常多教程拍照的图片.都是缩略图不是非常清晰 ...
- .Net MVC的学习(一)
套种间作,也挺有意思的--近来学习感悟.DRP学习的同一时候,折腾了点曾经不曾学习可是却非常多次耳闻过的东西--Asp.Net中的MVC架构模式. 一.是什么? MVC,即(Model-View-Co ...
- VBA 第一天
公司实习第一天,excel搞不定啊,学点VBA留着用: 录制宏: 点击录制宏按钮以后,在这段期间你做的每一个操作都会被记录下来,直到你点击停止录制按钮才能够停下,停下来后在此期间每一个操作都会以宏代码 ...
- 再次建立wordpress
山大的火星人的站还在维护www.h4ck.org.cn. 也许是募课潮过后的效应,www时代还能聚合很多知识,到了客户端时代技术越发松散,很难发实用的技术总结. 如果重新审视问题不难发现,问题在于使用 ...
- setUserVisibleHint的使用.执行顺序和viewPager.setOffscreenPageLimit(0)不管用还是默认会加载第二个fragment
处理问题一:viewPager.setOffscreenPageLimit(0)不管用还是默认会加载第二个fragment的原因(源码解读); 处理问题二:setUserVisibleHint的使用场 ...
- 对称平方数(to_string函数,stoi函数真香)
题目描述 打印所有不超过n(n<256)的,其平方具有对称性质的数.如11*11=121. 输入描述: 无 输出描述: 每行一个数,表示对称平方数. 示例1 输入 复制 无 输出 复制 无解题思 ...
- 路飞学城Python-Day12(practise)
# 函数基础# 1.写函数,计算传入数字参数的和(动态传参)# def sum_num(x,y):# return x+y# print(sum_num(1,2))# 2.写函数,用户传入修改的文件名 ...
- 状压DP复习
深感自己姿势水平之蒻……一直都不是很会状压DP,NOIP又特别喜欢考,就来复习一发…… 题目来源 Orz sqzmz T1 [BZOJ4197][NOI2015]寿司晚宴 (做过)质因数分解最大的质因 ...
- Spring boot配置404、500页面
Spring boot 配置404页面很简单,如果你访问的url没有找到就会出现spring boot 提示的页面,很明显Spring boot不用配置就可以显示404页面了. 在template下创 ...