Euclidean Nim(bzoj 4147)】的更多相关文章

Description Euclid和Pythagoras在玩取石子游戏,一开始有n颗石子. Euclid为先手,他们按如下规则轮流操作: ·若为Euclid操作,如果n<p,则他只能新放入p颗石子,否则他可以拿走p的倍数颗石子. ·若为Pythagoras操作,如果n<q,则他只能新放入q颗石子,否则他可以拿走q的倍数颗石子. 拿光所有石子者胜利.假设他们都以最优策略操作,那么获胜者是谁?   Input 第一行包含一个正整数t(1<=t<=1000),表示数据组数. 接下来t行…
[算法]博弈论+数论 [题意]给定n个石子,两人轮流操作,规则如下: 轮到先手操作时:若石子数<p添加p个石子,否则拿走p的倍数个石子.记为属性p. 轮到后手操作时:若石子数<q添加q个石子,否则拿走q的倍数个石子.记为属性q. 拿走所有石子的人胜利,问先手是否必胜,或输出游戏会永远进行下去. [题解]学习自:BZOJ 4147 AMPPZ2014 Euclidean Nim 博弈论+数论 by popoqqq 首先博弈过程可以表示为不定方程ap+bq=n. 然后由扩欧可知此方程有解当且仅当g…
4147: [AMPPZ2014]Euclidean Nim Time Limit: 1 Sec Memory Limit: 256 MB Description Euclid和Pythagoras在玩取石子游戏,一开始有n颗石子. Euclid为先手,他们按如下规则轮流操作: ·若为Euclid操作,如果n< p,则他只能新放入p颗石子,否则他可以拿走p的倍数颗石子. ·若为Pythagoras操作,如果n< q,则他只能新放入q颗石子,否则他可以拿走q的倍数颗石子. 拿光所有石子者胜利.假…
orz PoPoQQQ神犇,每一篇题解都写得很清楚 (看了PoPoQQQ的哲♂学三部曲,瑟瑟发抖) CODE #include <cstdio> #include <algorithm> using namespace std; #define stop(x) return puts(x), 0 inline void read(int &num) { char ch; while((ch=getchar())<'0'||ch>'9'); for(num=0;c…
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem 10983 18765 Y 1036 [ZJOI2008]树的统计Count 5293 13132 Y 1588 [HNOI2002]营业额统计 5056 13607 1001 [BeiJing2006]狼抓兔子 4526 18386 Y 2002 [Hnoi2010]Bounce 弹飞绵羊 43…
[AMPPZ2014]The Lawyer 记录每天结束的最早的会议以及开始的最晚的会议即可. #include<cstdio> #define N 500010 int n,m,i,d,a[N],b[N],st[21],en[21]; inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&am…
这题……咋说捏,其实是一道披着博弈论外衣的树上操作问题…… 随便用dfs序或者树链剖分转成序列,然后查询路径上的所有点的NIM和(异或和)就行了,毕竟除了是在树上以外,就是裸的NIM问题. 树链剖分:一开始把线段树写跪了,然后输出“Yes”和“No”的时候全部大写了,再然后发现线段树空间开小了…… 代码如下: //BZOJ 2819 #include<cstdio> #include<vector> #include<cstring> #include<cstdl…
题目链接: BZOJ - 2819 题目分析 我们知道,单纯的 Nim 的必胜状态是,各堆石子的数量异或和不为 0 .那么这道题其实就是要求求出树上的两点之间的路径的异或和.要求支持单点修改. 方法一:树链剖分 这道题用树链剖分显然是可以做的,并且也很好写.我刚开始写完之后又 WA 了,又是线段树写错了!!这次是建树的时候写错了! Warning!Warning! 代码: #include <iostream> #include <cstdio> #include <cstr…
[题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即可(保留最多的不为0的堆) [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <set> #include <map&g…
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2819 分析: 树上的nim游戏,关键就是要判断树上的一条链的异或值是否为0 这个题目有单点修改和一条链上的询问,很显然可以用树链剖分做,但是n<=50W,所以会TLE+爆栈 我们设f[x]表示点x到根节点这条路径上的异或和,那么很显然如果询问u,v上的异或和,那么ans=f[u]^f[v]^v[lca(u,v)] 那么接下来的问题就是对于每个单点修改,如何维护f[] 容易看出来,如果…