组合数学
文章平均质量分 63
ACdreamers
这个作者很懒,什么都没留下…
展开
-
HDU1524(博弈--有向无环图SG函数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1524题意:在一个有向无环图上有n个顶点,每一个顶点都只有一个棋子,有两个人,每次根据这个图只能将任意一颗棋子移动一步,如果到某一步玩家不能移动时,那么这个人就输.分析:本题是最典型的有向无环图的博弈,利用dfs把所有顶点的SG值都计算出来,然后对每个棋子的SG值进行异或运算,如原创 2013-11-24 19:15:32 · 2994 阅读 · 0 评论 -
Chomp!博弈(巧克力游戏)
有一个n*m的棋盘,每次可以取走一个方格并拿掉它右边和上面的所有方格。拿到左下角的格子(1,1)者输,如下图是8*3的棋盘中拿掉(6,2)和(2,3)后的状态。结论:答案是除了1*1的棋盘,对于其他大小的棋盘,先手总能赢。分析:有一个很巧妙的证明可以保证先手存在必胜策略,可惜这个证明不是构造性的,也就是说没有给出先手怎么下才能赢。证明如下:原创 2013-11-29 11:05:39 · 8620 阅读 · 1 评论 -
斐波那契博弈
题目:取石子游戏hdu2516 234(-1) 解释4 - 1 = 3 , n==3为必败点,所以4为必胜点56(-1)7(-2)89(-1)10(-2)11(-3)12(-1) 13首先 2个石头肯定是必败点,3个石头也是必败点,然后开始看后面,4个石头时,可以去一个使对手到必败点,而对手在这种情原创 2013-02-17 20:28:45 · 4047 阅读 · 0 评论 -
博弈论初步学习
一.巴什博弈(Bash Game):首先我们来玩一个比较古老的报数游戏。A和B一起报数,每个人每次最少报一个,最多报4个。轮流报数,看谁先报到30.如果不知道巴什博弈的可能会觉得这个是个有运气成分的问题,但是如果知道的人一定知道怎样一定可以赢。比如A先报数的话,那么B一定可以赢(这里假定B知道怎么正确的报数)B可以这样报数,每次报5-k(A)个数,其中k(A)是A报数的个数原创 2013-02-17 21:40:36 · 1778 阅读 · 0 评论 -
翻棋子游戏与Nim游戏
题意:一个棋盘上每个格子有一个棋子,每次操作可以随便选一个朝上的棋子(x,y),代表第i行第j列的棋子,选择一个形如(x,b)或(a,y)(其中b 分析:把坐标为(x,y)的棋子看成大小分别为x和y的两堆石子,则本题转化为了经典的Nim游戏,如果难以把棋子看作石子,可以先把Nim游戏中的一堆石子看成一个正整数,则Nim游戏中的每次操作是把其中一个正整数减小或者删除。原创 2013-11-29 17:06:32 · 3396 阅读 · 0 评论 -
HDU3389(阶梯博弈)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3389题意:1-N带编号的盒子,当编号满足A>B && A非空 && (A + B) % 3 == 0 && (A + B) % 2 == 1则可以从A中取任意石头到B中,谁不能取了谁就输。分析: 其本质为阶梯博弈。 阶梯博弈:博弈在一列阶梯上进行,每个原创 2013-11-29 18:38:13 · 3220 阅读 · 2 评论 -
类Nim取石子游戏
题目:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3060题意:有n堆石子,分别有个,这里,两个游戏者轮流操作,每次可以选一堆,拿走至少一个石子,但是不能拿走超过一半的石子。比如,若有3堆石子,每堆分别有5,1,2个,则在原创 2013-11-29 19:03:32 · 4911 阅读 · 0 评论 -
Ferguson博弈
清空/分割游戏也叫做Ferguson博弈。进行游戏需要用到两个盒子,在游戏的开始,第一个盒子中有n枚石子,第二个盒子中有m个石子(n, m > 0)。参与游戏的两名玩家轮流执行这样的操作:清空一个盒子中的石子,然后从另一个盒子中拿若干石子到被清空的盒子中,使得最后两个盒子都不空。当两个盒子中都只有一枚石子时,游戏结束。最后成功执行操作的玩家获胜。找出游戏中所有的P位置。原创 2013-11-29 10:35:47 · 1986 阅读 · 0 评论 -
K倍动态减法游戏
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2580#include #include #include using namespace std;const int N = 2000005;int a[N],b[N];int main(){ int T,tt=1; int n,k; scanf("原创 2013-12-02 21:05:44 · 2520 阅读 · 0 评论 -
HDU1850(Nim游戏)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1850 题意:对于Nim游戏:有n堆石子,每堆有a[i]个,每人轮流从任意堆中取任意多的石子(一次不能同时从多堆中拿),每次至少取一个,多者不限,最后取光者胜。先手的人如果想赢,一共有几种选择? #include #include #include using nam原创 2013-10-17 13:39:58 · 1419 阅读 · 0 评论 -
组合游戏
组合游戏的特点 (1)两个玩家 (2)游戏的操作状态是一个有限的集合 (3)游戏的双方轮流操作 (4)双方每次操作必须符合游戏规定 (5)当一方不能将游戏继续进行的时候,游戏结束,同时对方获胜 (6)无论如何操作,游戏总能在有限次操作后结束 必败点(P点)与必胜点(N点) 必败点:前一个选手将取胜的位置称为必败点。 必原创 2014-02-09 11:56:57 · 3361 阅读 · 0 评论 -
next_permutation函数
next_permutation的函数声明:#include bool next_permutation( iterator start, iterator end );可以看到 next_permutation 的返回值是布尔类型,写了一个标准C++程序:在STL中还有perv_permutation()函数#include #include #include原创 2013-01-26 14:13:55 · 11933 阅读 · 0 评论 -
范德蒙恒等式的证明
今天我们来认识组合数学中一个重要的恒等式---范德蒙恒等式。这个恒等式的表述如下 很自然的公式,接下来一起来看看它的证明,在维基百科上给出了两种方法证明,分别如下 (1)组合方法证明 甲班有个同学,乙班有个同学,从两个班中选出个一共有种不同的选法。而换一种思维方式 从甲班中选取个同学,从乙班中选取个同学,共有种方法,而原创 2014-06-16 10:23:55 · 15359 阅读 · 1 评论 -
Catalan数推导及应用
一、Catalan数的定义: 令h(1)=1,Catalan数满足递归式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2该递推关系的解为:h(n) = C(2n-2,n-1)/n,n=1,2,3,... h(n)=h(0)*h(n-1)+h(1)*h(n-2)+....+h(n-1)*h(0)=C(2n,原创 2012-06-03 20:31:58 · 12577 阅读 · 0 评论 -
取石子游戏与SG函数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1848题意:有3堆石子,石子数量分别为a,b,c,有两个玩家,每次只能从任意一堆中取f个,这里的f只能为fibnacci数,问是先手胜还是先手败.分析:由于石子的数量都在1000以内,那么我们可以先预处理出1000以内的SG函数值,然后对于3堆石子,我们进行异或,如果为0说明原创 2013-11-24 20:07:53 · 2285 阅读 · 0 评论 -
POJ2369 置换群
题目:http://poj.org/problem?id=2369题意:给定一个序列,问需要最少需要置换多少次才能变为有序序列.分析:对于每一位,算出最少的置换到自己应该的数字。每一位都有这样的数字,取最小公倍数就可以。#include #include #include using namespace std;const int N = 1005;原创 2013-11-21 15:06:57 · 2609 阅读 · 0 评论 -
HDU4259(简单群置换)
题目:Double Dealing#include #include #define LL long longconst int N=1005;int n,k;int a[N][N];bool f[N];int num[N];LL gcd(LL a,LL b){ return b? gcd(b,a%b):a;}int mai原创 2013-02-18 00:10:59 · 1562 阅读 · 0 评论 -
HDU3929(容斥原理)
题目:Big Coefficients 题意:F(x) = (1+x)^a1 + (1+x)^a2 + ... + (1+x)^am,求系数是奇数的项的个数。容斥原理:递归形式dfs(int beg,set S,int sym){ ans+=num(S)*sym; for(int i=beg;i<=n;i++) dfs(i,S∩A[i原创 2013-07-09 13:02:50 · 1989 阅读 · 0 评论 -
HDU4633(Polya计数)
题目:Who's Aunt Zhang#include #include #include using namespace std;typedef long long LL;const LL MOD=10007;LL quick_mod(LL a,LL b){ LL ans=1; a%=MOD; while(b) { i原创 2013-08-02 19:15:14 · 1887 阅读 · 0 评论 -
HDU4372(第一类斯特林数)
题目:Count the Buildings题意:N座高楼,高度均不同且为1~N中的数,从前向后看能看到F个,从后向前看能看到B个,问有多少种可能的排列数。0 组合数学。ans(n, f, b) = C[f + b - 2][f - 1] * S[n - 1][f + b - 2];C:组合数 因为最高的楼层必然是N,我原创 2013-08-03 14:54:16 · 4708 阅读 · 4 评论 -
HDU4390(容斥原理)
题目:Number Sequence#include #include #include using namespace std;typedef long long LL;const int N=1000005;const LL MOD=1000000007;int p[N];int a[N],b[N];bool prime[N];LL C[1005][100原创 2013-08-03 20:36:31 · 1338 阅读 · 0 评论 -
HDU3388(二分+容斥原理)
题目:Coprime题意:给三个数m,n,k, 0思路:二分+容斥原理 由于所找的数与m,n互质,那么这个数不能含有m,n所包含的素因子。但是k很大,不可能一个一个生成。于是二分,找到最小的x,使得小于或等于x的数中满足条件的数的个数大于或等于k,则这个最小值即为答案。在判断小于或等于x的数中满足条件的数的个数时,可用容原创 2013-08-04 11:49:11 · 2382 阅读 · 0 评论 -
错排公式的容斥推导
问题提出:n封不同的信对应n个不同的信箱,问都装错信封的方法有多少种?原创 2012-11-07 21:30:03 · 5153 阅读 · 0 评论 -
限制排列与棋盘多项式
首先来说说限制排列 例子:相邻禁位排列问题:在整数1,2,3,...,n的无重全排列中,要求,求全体排列数 分析:利用容斥不难得到 旋转木马问题:8个小孩围坐在旋转木马上,问有多少种变换座位的方法,使得每个小孩前面坐的都不是原来的小孩?分析:其实做法跟上面的方法一样,只是注意这里是换排列,那么总数就应该是7!,得到结果为: 棋盘多项式:原创 2013-08-12 18:26:35 · 9479 阅读 · 1 评论 -
第一类Stirling数和第二类Stirling
第一类Stirling数 s(p,k) s(p,k)的一个的组合学解释是:将p个物体排成k个非空循环排列的方法数。 s(p,k)的递推公式: s(p,k) = (p-1)*s(p-1,k) + s(p-1,k-1) ,1 边界条件:原创 2013-01-19 23:33:14 · 16693 阅读 · 2 评论 -
容斥原理与多重集合
问题一:多重集合的组合问题 问题描述:给定3个a,4个b,5个c,现在要选10个元素,求一共有多少种组合? 分析:本问题就是相当于求S={3·a,4·b,5·c}的10组合数。首先,多重集合的组合有一个定理,定理描述如下:设S是有k种类型对象的多重集合,每种元素均具有无限的重复数,那么S的r组合的个数等于: 那么既然这样,我们令S∞={∞·a, ∞·b,∞·c},那原创 2013-08-12 14:56:44 · 6429 阅读 · 1 评论