![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数论-博弈
lab104_yifan
这个作者很懒,什么都没留下…
展开
-
UVA 11859 - Division Game(Nim游戏)
UVA 11859 - Division Game 题目链接 题意:给定一个矩阵,每次能选一行中几个数字,把他们变成他们的因子,最后不能变的人输,问是否能先手必胜 思路:转变成因子等价于删去一些素数,这样问题转化为了Nim游戏 代码: #include #include const int N = 10005; int t, n, m, num, cnt[N],原创 2014-07-16 11:35:23 · 1243 阅读 · 0 评论 -
UVA 847 - A Multiplication Game(博弈)
UVA 847 - A Multiplication Game 题目链接 题意:一个数一开始是1,每次轮流乘2-9,谁先大于n谁就赢,问谁胜 思路:博弈,找出必胜态,2-9为stan,10-18为ollie,19-162为stan...发现都是乘2乘9交替 代码: #include #include #include long long n; bool ju原创 2014-07-16 20:12:56 · 1157 阅读 · 0 评论 -
UVA 10368 - Euclid's Game(数论+博弈)
10368 - Euclid's Game 题目链接 题意:Stan和Ollie玩游戏,有两个数字a,b,每次可以选择较小数字的倍数,把另一个数字-去这个数,要保证>= 0,最后谁那步能得出0谁就赢了,问谁会赢。 思路:其实这个相减的过程就是一个辗转相除的过程,考虑每一次辗转相除,如果只有1倍的数可以减,那么必须到下一步,如果有多步,先手的就有机会选择是自己到下一步或者让对方到下原创 2014-06-26 11:15:45 · 1326 阅读 · 0 评论 -
UVA 1378 - A Funny Stone Game(博弈)
UVA 1378 - A Funny Stone Game 题目链接 题意:给定n堆石头,然后每次能选i, j, k,3堆(i 思路:组合游戏,需要转化,把石子一字排开,最后肯定都归到n堆上,n堆是不能取的,所以假设每个石子代表一堆,从左往右分别是n - 1, n - 2, n - 3 ... 2, 1, 0,然后每次取一个加两个,就相当于取掉一堆,多上两堆,这样就转化为了Ni原创 2014-08-06 11:38:27 · 1805 阅读 · 1 评论 -
UVA 1566 - John(anti-Nim)
UVA 1566 - John 题目链接 题意:给定n堆糖果,每次取一堆任意个数,取到最后一个的输 思路:anti-Nim,推导出来就是如果全为1,判断1的奇偶,如果不为1,就和Nim问题是一样的,判断异或和 代码: #include #include int t, n; bool solve() { scanf("%d", &n); int原创 2014-08-06 13:26:06 · 1152 阅读 · 0 评论 -
UVA 11249 - Game(博弈)
UVA 11249 - Game 题目链接 题意:两堆石头,a和b,每次能取一堆任意数量,或者两堆同时取,但是绝对值差不能超过k,最后不能取的人输,问先手是否能赢 思路:先假设(a, b)石子,a是少的一堆,首先很容易看出(1, k + 2)是必败的,设下一个是(2, x)那么如果这个状态能到(1, k + 2)那么就是必胜,要找出(2, x)必败状态,就必然是上个状态多的一堆石原创 2014-08-05 23:53:38 · 1342 阅读 · 0 评论 -
UVA 12163 - Addition-Subtraction Game(博弈)
UVA 12163 - Addition-Subtraction Game 题目链接 题意:给定一个有向图,每个结点有一个ki,然后每次游戏给每个结点一开始一个值,每次轮流选一个位置,满足它能到下一个结点,并且值为正,把值-1,然后在周围结点选k[i]个+1,问最后谁不能操作谁输,问每次游戏输赢 思路:先在图上构造sg函数,由于每个结点最多连接15个结点,这样就可以枚举加了奇数次原创 2014-08-06 14:48:08 · 1125 阅读 · 0 评论 -
UVA 1500 - Alice and Bob(博弈)
UVA 1500 - Alice and Bob 题目链接 题意:alice和bob这对狗男女play a game,黑板上有n个数字,每次能把一个数字减1,或者把两个数字合成一个数字,值为两数的和,数字减到0就自动被擦去,最后不能操作的算输,alice先手,问最后谁赢 思路:博弈问题,首先想到一点就很好办了,就是对于非1的所有数,肯定会优先去合并成一个数字的,因为如果当前状态能原创 2014-08-06 16:27:47 · 1382 阅读 · 0 评论 -
HDU 1850 Being a Good Boy in Spring Festival(Nim游戏)
HDU 1850 Being a Good Boy in Spring Festival 题目链接 题意:中文题 思路:Nim游戏,每次枚举每个位置,可以计算出其他位置的异或和,然后如果当前位置的个数大于这个异或和,说明肯定可以取一些石头使得异或和为0,方案数+1 代码: #include #include const int N = 105; int m,原创 2014-08-09 16:29:11 · 660 阅读 · 0 评论 -
10165 - Stone Game(Nim游戏)
UVA 10165 - Stone Game 题目链接 题意:给定n堆石子,每次能在一堆取1到多个,取到最后一个赢,问谁赢 思路:就裸的的Nim游戏,利用定理求解 代码: #include #include int n, num; int main() { while (~scanf("%d", &n) && n) { int sum = 0;原创 2014-07-16 17:53:54 · 892 阅读 · 0 评论 -
UVA 1558 - Number Game(博弈dp)
UVA 1558 - Number Game 题目链接 题意:20之内的数字,每次可以选一个数字,然后它的倍数,还有其他已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法 思路:利用dp记忆化去求解,要输出方案就枚举第一步即可,状态转移过程中,选中一个数字,相应的变化写成一个函数,然后就是普通的博弈问题了,必胜态之后必有必败态,必败态之后全是必胜态 代码:原创 2014-07-16 23:57:46 · 1113 阅读 · 0 评论 -
UVA 1482 - Playing With Stones(SG打表规律)
UVA 1482 - Playing With Stones 题目链接 题意:给定n堆石头,每次选一堆取至少一个,不超过一半的石子,最后不能取的输,问是否先手必胜 思路:数值很大,无法直接递推sg函数,打出前30项的sg函数找规律 代码: #include #include int t, n; long long num; long long SG(long原创 2014-07-16 12:15:19 · 1836 阅读 · 0 评论 -
UVA 10561 - Treblecross(博弈SG函数)
UVA 10561 - Treblecross 题目链接 题意:给定一个串,上面有'X'和'.',可以在'.'的位置放X,谁先放出3个'X'就赢了,求先手必胜的策略 思路:SG函数,每个串要是上面有一个X,周围的4个位置就是禁区了(放下去必败),所以可以以X分为几个子游戏去求SG函数的异或和进行判断,至于求策略,就是枚举每个位置就可以了 代码: #include #原创 2014-07-16 13:46:37 · 1653 阅读 · 0 评论 -
UVA 12293 - Box Game(博弈)
UVA 12293 - Box Game 题目链接 题意:两个盒子,一开始一个盒子有n个球,一个只有1个球,每次把球少的盒子中球消掉,把多的拿一些球给这个盒子,最后不能操作的输(球不能少于1个),Alice先手,问谁赢 思路:博弈,题目其实可以转化为,给定一个n,每次把减少1到n/2的数字,最后谁是1谁就输了,那么可以去递推前几项找个规律,或者推理,都可以发现只要是2^i - 1原创 2014-07-16 15:28:37 · 1470 阅读 · 0 评论 -
11892 - ENimEN(博弈)
UVA 11892 - ENimEN 题目链接 题意:给定n堆石头,两人轮流取,每次只能取1堆的1到多个,如果上一个人取了一堆没取完,那么下一个人必须继续取这堆,取到最后一个石头的赢,问谁赢 思路:简单推理一下,后手只可能在堆数偶数并且都是1的情况下才可能赢 代码: #include #include const int N = 20005; int t, n,原创 2014-07-16 15:44:53 · 1012 阅读 · 0 评论 -
UVA 11534 - Say Goodbye to Tic-Tac-Toe(博弈sg函数)
UVA 11534 - Say Goodbye to Tic-Tac-Toe 题目链接 题意:给定一个序列,轮流放XO,要求不能有连续的XX或OO,最后一个放的人赢,问谁赢 思路:sg函数,每一段...看成一个子游戏,利用记忆化求sg值,记忆化的状态要记录下左边和右边是X还是O即可 代码: #include #include const int N = 105;原创 2014-07-16 21:18:11 · 1597 阅读 · 0 评论 -
UVA 11927 - Games Are Important(sg函数)
UVA 11927 - Games Are Important 题目链接 题意:给定一个有向图,结点上有一些石头,两人轮流移动石头,看最后谁不能移动就输了,问先手还后手赢 思路:求出每个结点的sg函数,然后偶数个石头结点可以不用考虑,因为对于偶数情况,总步数肯定能保证是偶数,所以只要考虑奇数情况的结点 代码: #include #include #include原创 2014-07-16 16:51:11 · 889 阅读 · 0 评论 -
UVA 1557 - Calendar Game(博弈dp)
UVA 1557 - Calendar Game 题目链接 题意:给定一个日期,两个人轮流走,每次可以走一月或者一天,问最后谁能走到2001.11.4这个日子 思路:记忆化搜索,对于每个日期,如果下两个状态有一个非必胜态,那么这个状态是必胜态,如果后继状态都是必胜态,那么该状态为必败态 代码: #include #include const int day[13原创 2014-07-16 22:07:49 · 1018 阅读 · 0 评论 -
UVA 1559 - Nim(博弈dp)
UVA 1559 - Nim 题目链接 题意:一开始有s个石子,2n个人轮流取石子,每个人有个最大能取数目,2n个人奇数一队,偶数一队,取到最后一个石子的队输,问谁赢 思路:记忆化搜索,每个人取的时候对应的后继状态如果有一个必败态,则该状态为必胜态,如果都是必胜态,则该状态为必败态 代码: #include #include int n, s, m[25], d原创 2014-07-16 22:46:20 · 1502 阅读 · 0 评论 -
HDU 5011 Game(西安网络赛E题)
HDU 5011 Game 题目链接 思路:其实就求一个Nim和即可,要推也不难推,和为0下一个必然是胜态,因为至少取走一个,在怎么分也达不到原来那个值了,如果是非0值,就和原来Nim一样必然可以取一堆使得变成0 代码: #include #include const int N = 100005; int n; long long a, sum; int mai原创 2014-09-14 18:48:36 · 1526 阅读 · 3 评论