[poj2505]A multiplication game_博弈论】的更多相关文章

A mutiplication game poj-2505 题目大意:给定一个数n和p,两个选手每次可以将p乘上[2,9].最先使得p大于n的选手胜利. 注释:$1\le n\le 4294967295$,$p=1$. 想法: 这个题比较新颖,我们可以直接推出必败态区间. 最后,附上丑陋的代码... ... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm>…
A multiplication game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6028   Accepted: 3013 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 =…
http://poj.org/problem?id=2505 感觉博弈论只有找规律的印象已经在我心中埋下了种子... 题目大意:两个人轮流玩游戏,Stan先手,数字 p从1开始,Stan乘以一个2-9的数,然后Ollie再乘以一个2-9的数,直到谁先将p乘到p>=n时那个人就赢了,而且轮到某人时,某人必须乘以2-9的一个数. 题目大意来源http://blog.csdn.net/jc514984625/article/details/71157698 因为谷歌翻译太难懂了,所以总是找题解找题目大…
题目链接:http://poj.org/problem?id=2505 题目大意: 两个人轮流玩游戏,Stan先手,数字 p从1开始,Stan乘以一个2-9的数,然后Ollie再乘以一个2-9的数,直到谁先将p乘到p>=n时那个人就赢了,而且轮到某人时,某人必须乘以2-9的一个数. 解题思路: 这是一道博弈论的题目.不过这道题并没有用SG函数相关的知识.首先我们可以很快判断区间[2,9]必定是先手胜然后紧接着是区间[10,18]区间是后手胜然后是什么呢?[18,??]我们可以这样来理解:我们可以…
思路:求必胜区间和必败区间! 1-9 先手胜 10-2*9后手胜 19-2*9*9先手胜 163-2*2*9*9后手胜 …… 易知右区间按9,2交替出现的,所以每次除以18,直到小于18时就可以直接判断了. 代码如下: #include<cstdio> int main() { double n; while(scanf("%lf",&n)!=EOF){ ) n/=; ) puts("Stan wins."); else puts("O…
题意 开始时$p = 1$,每次可以乘$2 - 9$,第一个使得$p \geqslant n$的人赢 问先手是否必胜 $1 <n <4294967295$ Sol 认真的推理一波. 若当前的数为$\frac{n}{9} \leqslant x \leqslant n$,则先手必胜 若当前的数为$\frac{n}{18} \leqslant x \leqslant \frac{n}{9}$,则先手必败 若当前的数为$\frac{n}{18 * 9} \leqslant x \leqslant \…
A Chess Game poj-2425 题目大意:题目链接 注释:略. 想法:这个题就是为什么必须要用记忆化搜索.因为压根就不知道后继是谁. 我们通过SG定理可知:当前游戏的SG值等于所有子游戏的SG的异或和. 我们就可以dp了. 最后,附上丑陋的代码... ... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define N 1010 in…
Matches Game poj-2234 题目大意:n堆石子的Nim游戏,anti-SG. 注释:$1\le n\le 20$. 想法:用Colon定理即可.具体见:小约翰的游戏 最后,附上丑陋的代码... ... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int n; whi…
Cutting Game poj-2311 题目大意:题目链接 注释:略. 想法: 我们发现一次操作就是将这个ICG对应游戏图上的一枚棋子变成两枚. 又因为SG定理的存在,记忆化搜索即可. 最后,附上丑陋的代码... ... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define N 250 using namespace std; bool…
首先有SG(k)=mex(SG(k/2),SG(k/3)--SG(k/9)),SG(0)=0,通过打表可以发现当$n\in[1,1]\cup [10,18]\cup [163,324]--$,规律大概就是$[18^{k-1}+1,18^{k}/2]$时SG的值为0(即必败),那么只需要判断一下n是否能满足这个区间即可. 1 #include<cstdio> 2 long long n,t; 3 int main(){ 4 while (scanf("%lld",&n…