poj 2505 乘法博弈论】的更多相关文章

转自:http://hzwer.com/1921.html 题目大意: 题意:Stan从1开始,可以乘上2~9中任何一个数,Ollie也如此操作,只到某个人本回合的操作超过N为之..1<N<2^32-1 基本思路: 找到Stan的必败状态,[10,18],[163,324]……[9^n*2^(n-1)+1,9^n*2^n] 分析: 0-9:stan 10-18:ollie 19-162:stan 163-324:ollie 规律: 9 = 9 18 =2*9 162 = 9*2*9 324 =…
http://poj.org/problem?id=2960 sg函数几乎是模板题. 调试代码的最大障碍仍然是手残在循环里打错变量名,是时候换个hydra产的机械臂了[超想要.jpg] #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> #include<map> using namespace std; ;…
思路:dp[i][j]:第i个人时还剩j个石头. 当j为0时,有必胜为1: 后继中有必败态的为必胜态!!记忆化搜索下就可以了! 代码如下: #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<vector> #include<cstring> #define inf 1e9 using namespace std; ][],n…
令ans=a1^a2^...^an,如果需要构造出异或值为0的数, 而且由于只能操作一堆石子,所以对于某堆石子ai,现在对于ans^ai,就是除了ai以外其他的石子 的异或值,如果ans^ai<=ai,那么对于ai的话,是可以减小到ans^ai的值,然后使得所有数 的异或值为0,也即转移到了必败态. 代码如下: #include<iostream> #include<stdio.h> #include<cstring> using namespace std; ]…
题目链接题意: 有一个数p=1,甲乙两人轮流操作,每次可以把p乘2~9中的一个数,给定一个n,当一个人操作后p>=n,那么这个人赢,问先手是否必胜. 必胜状态:存在一种走法走到一个必败状态. 必败状态:后继状态都为必胜状态. 我们可以知道>=n的数都为必败状态,可以转移到>=n的最小的数为n/9(上取整),所以 n/9~n-1都为必胜态,同理n/9/2(都为上取整)为最小的必须转移到n/9~n-1(必胜状态)的状态,所以n/9/2~n/9-1为必败态,于是就可以这样推到1,看一下1是必胜…
A multiplication game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5622   Accepted: 2811 Description Stan and Ollie play the game of multiplication by multiplying an integer p by one of the numbers 2 to 9. Stan always starts with p =…
题目链接 #include<iostream> #include<cstdio> using namespace std; typedef long long ll; int main() { ll n; while(~scanf("%I64d",&n)) {//其实算是 贪心了吧 //先手想赢,他会x2,这样子才能尽量避免让后手赢 //后手想赢,他就会x9,只有乘最大的,他胜算才最大 ; ll l=,r=; ) { if(n>=l&&am…
题目 题意:两个人轮流玩游戏,Stan先手,数字 p从1开始,Stan乘以一个2-9的数,然后Ollie再乘以一个2-9的数,直到谁先将p乘到p>=n时那个人就赢了,而且轮到某人时,某人必须乘以2-9的一个数.1 < n < 4294967295 如果,n∈[2,9],那么stan必胜.[9] 如果,n∈[10,18],stan先手,只能给到[2,9]之间的数字.Stan不想让对方赢,所以最小给2,那么Olilie要让自己赢最大取9,最多能取到18:如果Stan给9,那么Olilie随便…
#include<iostream> #include<stdio.h> using namespace std; int main() { //freopen("acm.acm","r",stdin); unsigned num; unsigned mod; unsigned begin; unsigned end; int i; i = ; while(cin>>num) { begin = ; end = ; &&a…
题意:两个人做游戏,每个人都可以在自己的回合里将数p乘以2到9之间的一个数,初始时p=1,谁先将p乘到大于等于n就算赢. 思路:一开始我算sg值,结果算来算去都没算明白... 后来看了别人题解,才豁然开朗. 首先,对于一个数m,计算出p在什么范围内可以乘到大于等于m.该范围即为[ceil(m/9), m - 1].其中ceil()为向上取整.如果将每一个数字都看作一个局面的话,则在该区间内的点即为N点. 对于一个数m,计算出p在什么范围内只能乘到大于等于m.该范围即为[ceil(m/2), m…