![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
组合数学
qq_38232157
这个作者很懒,什么都没留下…
展开
-
POJ 2425 A Chess Game(图游戏的sg函数,记忆化搜索,模板题)
图游戏的sg函数,记忆化搜索,模板题题目意思:给出n个坐标点(从 0 到 n - 1), 然后给出了每个坐标点可以到的 下一个坐标点。 现在两个人玩游戏,每次有 若干个棋子放到这些坐标点上,然后两人轮流把某个棋子走一步。如果某人无法移动任何棋子,该人就输了。对于每盘棋子,有m次询问, 每次询问给出了 若干个坐标,这些坐标放好了棋子。然后开始玩游戏。本题要点:1、 典型的 图游戏,有向无环图,使用sg函数求解。先求出所有的坐标点的sg 函数值,每次询问 若干个坐标点 {y1, y2, …, y原创 2020-09-08 12:52:09 · 133 阅读 · 0 评论 -
HOJ 1850 Being a Good Boy in Spring Festival(尼姆游戏,模板题)
尼姆游戏,模板题典型游戏:n 堆石头,每堆石头数量 a[1], a[2], …, a[n]. 两人玩游戏,轮流从某一堆石头取走任意多个,取到最后一个石头的为胜者。结论:a[1] ^ a[2] ^ … ^ a[n] != 0, 先手必胜a[1] ^ a[2] ^ … ^ a[n] == 0, 先手必败简单证明:a[1] ^ a[2] ^ … ^ a[n] != 0, 先手必胜的时候, 任意选择一堆 a[i], 对剩下的 n - 1 堆,求异或和,假设为 H, 如果 H < a[i原创 2020-09-08 00:16:18 · 85 阅读 · 0 评论 -
HOJ 1848 Fibonacci again and again(sg函数,尼姆游戏,模板题)
sg函数,尼姆游戏,模板题sg函数求解尼姆游戏,步骤:尼姆游戏模型,有 n堆石头,每堆石头的石头数量是 a[1], a[2], a[3], … , a[n]。现在要求每次在一堆石头里拿掉 x 个石头。 x 的取值在 集合 {x1, x2, x3, …, xk} 里面。拿到最后一个石头的为胜者。结论: 求出每堆石头的 sg 函数值 sg[a[i]], 1 <= i <= n,sg[a[1]] ^ sg[a[2]] ^ … ^ sg[a[n]] != 0, 此时先手必胜。sg[a[1]原创 2020-09-07 23:59:51 · 753 阅读 · 0 评论 -
HOJ 1846 Brave Game(巴什游戏,水题)
/*巴什游戏,水题本题要点:1、如果当前剩下的石头 n 是 m + 1 的倍数,甲必输。*/#include <cstdio>#include <cstring>#include <iostream>using namespace std;int T, n, m;int main(){ scanf("%d", &T); while(T--) { scanf("%d%d", &n, &m); if(n % (m原创 2020-09-07 21:13:59 · 87 阅读 · 0 评论 -
HOJ 2147 kiki‘s game(P-position, N-position 游戏入门)
P-position, N-position 游戏本题要点:1、画出一个 n * m 的表,观察规律。题目说,从点 (1, m), 沿着 左,左下,正下 三个方向,直到走到矩阵的左下角 点 (n, 1)。现在每一点 (x, y) 用 1 或者 0 填充。(x, y) 填 0,表示 KIKI 将要从点 (x, y) 走一步,必败。2、 设当前点是 (x, y), 那么下一个点 可能有3 个 :(x, y - 1), (x + 1, y - 1), (x + 1, y)状态从左下角点 (n, 1)原创 2020-09-07 21:10:46 · 184 阅读 · 0 评论 -
HOJ 2643 Rank(第二类斯特林数,裸题)
第二类斯特林数,裸题题目意思:给出n个人,计算他们的可能的排名的数目. 学生x 和 y 的关系有三种,x > y, x == y, x < y;本题要点:1、第二类斯特林数,定义:把n个不同相同的元素,放到k个相同的集合,不允许集合为空。 一共有 s2(n, k) 中放法。2、n个学生,可能有 m 个不同的分数, m 的取值范围是 1 <= m <= n;n个学生,放到 m个不同集合里面,有 s2(n, m) 种放法。但是这m个集合的顺序不同的话,视作不同的排名。因此原创 2020-08-29 18:21:47 · 126 阅读 · 0 评论 -
HOJ 5184 Brackets(卡特兰数,棋盘问题的推导,经典)
卡特兰数,棋盘问题的推导题目意思:定义了括号的合法排列方式,给出一个排列的前一段,问能组成多少种合法的排列本题要点:1、推导过程:n对括号排列,左括号看做是在棋盘沿着 x 方向走, 右括号看做是在棋盘沿着 y 方向走.前面的任意k个括号,左括号的数 >= 右括号的数。相当于在棋盘走,没有超过 y = x 这条线。这就是卡特兰数的定义。2、现在问题有所加深:题目给出一部分括号排列的总长度为 n ,左右括号各为 m = n / 2 个。当给定的排列方式完全合法的时候,剩下需要排列的左右括原创 2020-08-29 17:23:52 · 252 阅读 · 1 评论 -
HOJ 4372 Count the Buildings(第一类斯特林数,经典)
第一类斯特林数题意:一排房子,总共N幢,高度为1~N,从左边能看到F幢,从右边能看到F幢,问房子排列的可能本题要点:1、题目转化为第一类斯特林数:点这里最高的房子必然两边都能看到, 设编号为n, 把n固定。然后左边看到 f - 1 栋房子, 右边看到b - 1 栋房子。 左边的房子分为 f - 1 组, 右边的房子分为 b - 1 组。每一组选一个最高的房子出来做代表。那么楼n的左边,从左到右,组与组之间最高的元素一定是单调递增的,且每组中的最高元素一定排在该组的最左边,每组中的其它元素可以任原创 2020-08-29 00:49:48 · 99 阅读 · 0 评论 -
HOJ 1130 How Many Trees?(卡特兰数,大数)
卡特兰数,大数本题要点:1、大数求前100项的卡特兰数,打表即可。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 101;int n;struct bign{ int d[1000]; int len; bign() { memset(d, 0, sizeof d); len = 0; }}c[Ma原创 2020-08-28 17:56:11 · 114 阅读 · 1 评论 -
HOJ 2067 小兔的棋盘(卡特兰数)
卡特兰数, 算法竞赛入门到进阶177页本题要点:1、通过组合公式得到的卡特兰公式h[n] = c[2n][n] - c[2n][n - 1]2、题目给出的 n <= 35, 刚好处于 long long的范围。题目要求输出的是 第 n项的 卡特兰数的2 倍。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 36;lo原创 2020-08-28 17:52:35 · 165 阅读 · 0 评论 -
HOJ 2110 Crisis of HDU(普通母函数,模板题)
普通母函数,模板题本题要点:1、用于多项式相乘的两个数组 sup 和 tmp, 开到 5k2、用一个变量标记 last 已经处理完的多项式,系数不等于0 的最大次数。不用每次都要遍历到第 m 项(m项的系数就是答案)3、 其他的套用母函数的模板。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 110, mod = 100原创 2020-08-27 17:56:37 · 64 阅读 · 0 评论 -
HOJ 4135 Co-prime(容斥原理,素数)
容斥原理,素数题意:输入三个数a,b,n,求[a,b]之间与n互质的个数本题要点:1、转化:这题可以转化成求[1,b]内与n互质的个数减去[1,a]内与n互质的个数。而[1,x]内与n互质的数可以转化成x-[1,x]内不与n互质的数。接下来就是求[1,x]与n不互质的数2、素数打表:先找出n以内的质因数保存在数组a里,如果没有就将n保存在数组a里。然后用 n/a1 + n/a2 +.... 但有一个很明显的问题是会有重复的元素加进去,这就需要用到容斥定理了,将多余的给减掉。公式是原创 2020-08-09 12:26:27 · 163 阅读 · 0 评论 -
HOJ 5776 sum(抽屉原理)
抽屉原理题目意思:有n个数,问存不存在连续子序列之和是m的倍数本题要点:1、抽屉原理有n+1件或n+1件以上的物品要放到n个抽屉中,那么至少有一个抽屉里有两个或两个以上物品。2、一个结论a1,a2,a3…am是正整数序列,至少存在整数k和r,1<=k<r<=m,使得ak+a(k+1)+…+a®是m的倍数。3、具体步骤用sum来记录数组a的前缀和,a) 如果某个 sum[i] % m == 0, 说明 sum[i] = a[1] + a[2] + … + a[i]是 m原创 2020-08-08 23:45:21 · 162 阅读 · 0 评论 -
POJ 2356 Find a multiple(抽屉原理,前缀和)
抽屉原理题目意思:n个数任取若干个, 这些数的和是n的倍数, 输出其中的任意一种取法,输出元素的下标即可本题要点:1、抽屉原理有n+1件或n+1件以上的物品要放到n个抽屉中,那么至少有一个抽屉里有两个或两个以上物品。2、一个结论a1,a2,a3…am是正整数序列,至少存在整数k和r,1<=k<r<=m,使得ak+a(k+1)+…+a®是m的倍数。此题中,必定存在解。3、具体步骤用sum来记录数组a的前缀和,a) 如果某个 sum[i] % c == 0, 说明 sum原创 2020-08-08 20:04:40 · 69 阅读 · 0 评论 -
HOJ 1205 吃糖果(抽屉原理)
抽屉原理本题要点:1、先找出数量最多的一种糖果,假设有N个, 其他所有的糖果有 S个。把N种糖果看做是N块挡板,其他的S个 糖果放在挡板之间。2、如果 S < N - 1, 说明至少有两个挡板之间没有放 糖果,而这两个挡板是同一种糖果,所以无解3、如果 S >= N - 1, 肯定有解。把S个糖果排队,其中同种类的糖果是连续的。每次取N个糖果,按顺序一个一个放到N个空间,由于隔板的数量比每一种的糖果数量都多,因此不可能有两个同类的糖果放到同一个空间。#include <原创 2020-08-08 18:07:19 · 123 阅读 · 0 评论 -
POJ 3370 Halloween treats(抽屉原理,前缀和)
抽屉原理题目意思:n个数任取若干个, 这些数的和是c的倍数, 输出其中的任意一种取法,输出元素的下标即可本题要点:1、抽屉原理有n+1件或n+1件以上的物品要放到n个抽屉中,那么至少有一个抽屉里有两个或两个以上物品。2、一个结论a1,a2,a3…am是正整数序列,至少存在整数k和r,1<=k<r<=m,使得ak+a(k+1)+…+a®是m的倍数。3、具体步骤用sum来记录数组a的前缀和,a) 如果某个 sum[i] % c == 0, 说明 sum[i] = a[1]原创 2020-08-08 16:42:27 · 119 阅读 · 0 评论