组合数学

组合数学---卡特兰数

百般思念 提交于 2020-02-19 15:10:57
long long f[25]; int main() { f[0] = 1; cin >> n; for (int i = 1; i <= n; i++) f[i] = f[i - 1] * (4 * i - 2) / (i + 1); //这里用的是常见公式2 cout << f[n] << endl; return 0; } View Code 可以解决的问题: 1.括号匹配问题,n对括号有多少种匹配方式? 2.进出栈问题,一个无穷大的栈,1,2,3...N 有多少种不同的出栈方式 3.二叉树种类问题:n个节点构成的二叉树,共有多少种不同情形 4.n*n的网格从左下走到右上角,不可走对角线,有多少种不同走法 5.凸多边形分割问题:求一个凸多边形区域划分成三角形区域的方法 6.集合划分问题:对于集合{1,2,3,...n}的不交叉划分的数目是多少 7.乘积重组问题:矩阵链乘P=a1*a2*a3*...an 8.连线不相交问题:在圆上有2n个点,将这些点连起来使得所得到的n条线段不相交的方法数 9.高矮排队问题:2n个高矮不同的人,每排必须是高到矮的顺序,而且第二排比第一排高,问排列的方式有多少种 10.门票找钱问题: 11. 来源: https://www.cnblogs.com/hznumqf/p/12331222.html

[专题总结]组合数学

随声附和 提交于 2020-02-16 10:09:58
好恶心的一个专题! 首先大致总结一下求组合数的方法: 暴力(复杂度为min(m,n-m))同时乘大数以及小数的逆元,其余部分分子分母相消。 lucas:适用于模数小的时候,复杂度log p n 杨辉三角:适用于m较小n不太大的时候,而且组合数要用到很多次。 大概挨着讲一讲每道题,顺便总结经验。  排队 : 上来先来一个高精组合数把你弄懵。抛下一句“注意答案可能很大”就走了 然而公式其实挺简单。想到题目里有一个额外的2,提出来单独考虑就行了。 高精运算*=加&会快一些。 Perm 排列计数 : 感觉很像二叉树(线段树)不对么? 递归它。把数列往下搜左右两半搜,子问题是一样的,把所有数分配给左右两边。组合数干它。 父结点比左右儿子大就可以了。也就是父结点拿走最大的数,剩下的随便分配给儿子们。 取模少了一个括号91分调半天。。 注意本题与地精部落的联系。可惜我没联系上,浪费了很多时间。 集合计数: 不简单。 题目及题解>>tap here 。 DZY Loves Maths II: 他每次出场都能招致许多麻烦! 题目及题解>>tap here 。 虔诚的墓主人: tdcp(数论里的数据结构狂模)告诉我要打线段树我还不信。。。我错了 但是暴力可以AC的啊。。。 题目及题解>>tap here 。 地精部落: milkfun mikufun提醒我之后我才发现它与第二题的联系。

组合数学——牡牛和牝牛

可紊 提交于 2020-02-13 00:55:53
牡牛和牝牛 约翰要带 N 只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛。 牛们要站成一排,但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有 K 只牝牛。 请计算一共有多少种排队的方法,所有牡牛可以看成是相同的,所有牝牛也一样,答案对 5000011 取模。 输入格式 一行,输入两个整数 N 和 K。 输出格式 一个整数,表示排队的方法数。 数据范围 1 ≤ N ≤ 1 0 5 1≤N≤10^5 1 ≤ N ≤ 1 0 5 , 0 ≤ K < N 0≤K<N 0 ≤ K < N 输入样例: 4 2 输出样例: 6 样例解释 6 种方法分别是:牝牝牝牝,牡牝牝牝,牝牡牝牝,牝牝牡牝,牝牝牝牡,牡牝牝牡。 题解: 感觉从此做组合数学有了新的思路。因为组合数学也是递推关系。所以我们用dp的方法来推。我们 f ( i ) f(i) f ( i ) 代表我们长度为i并且以1结尾的字符串的方案数。我们这里把牛当成0和1来看。 显然我们第i个位置放了1,那么最近的一个放1的位置就是i-k-1直到0都是可以放1的,第0个位置放1就代表这个序列不包含1。这里看来我们每个位置放1的方案数加起来就可以了。但是数据是 1 0 5 10^5 1 0 5 n方显然是不可以的,考虑题目中是前缀和的形式,所以我们边记录边加前缀和就可以了。 # include <bits

模板 - 数学 - 组合数学 - 组合数与错位排列数

主宰稳场 提交于 2020-02-06 19:34:43
线性预处理组合数,一般来说只是需要用一个组合数,当MOD大于n和m的时候可以这样求,否则应该用扩展Lucas定理。 const ll MOD = 1e9 + 7; const int MAXN = 1e6; ll inv[MAXN + 5], fac[MAXN + 5], invfac[MAXN + 5]; void init_C(int n) { inv[1] = 1; for(int i = 2; i <= n; i++) inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD; fac[0] = 1, invfac[0] = 1; for(int i = 1; i <= n; i++) { fac[i] = fac[i - 1] * i % MOD; invfac[i] = invfac[i - 1] * inv[i] % MOD; } } inline ll C(ll n, ll m) { if(n < m) return 0; return fac[n] * invfac[n - m] % MOD * invfac[m] % MOD; } 错位排列,D[i]表示i个(不同的)元素全部不在应该在的位置(升序/降序等唯一指定位置)的种类数,可以通过dp求出来,但是还是抄模板方便。 const ll MOD = 1e9 + 7; const

POJ 3252 组合数学?

断了今生、忘了曾经 提交于 2020-02-03 11:25:07
大神们的题解我一个都没看懂。。。。。。。。。。。 十分的尴尬 题意:算出闭区间内二进制中0的个数大于等于1的个数的数字有多少个 思路: 组合数学(n小于500的时候都可以出解,只不过高精比较麻烦)。 这道题还算比较仁慈。。。 Discuss里面有一段说得挺好的 看完各家算法,尝试独立分析一下: 以sample为例子 [2,12]区间的RoundNumbers(简称RN)个数:Rn[2,12]=Rn[0,12]-Rn[0,1] 即:Rn[start,finish]=Rn[0,finish]-Rn[0,start-1] 所以关键是给定一个X,求出Rn[0,X] 现在假设X=10100100 这个X的二进制总共是8位,任何一个小于8位的二进制都小于X 第一部分,求出长度为[0,7]区间内的二进制是RoundNumber的个数 对于一个长度为Len的二进制(最高位为1),如何求出他的RoundNumbers呢(假设为用R(len)来表达),分为奇数和偶数两种情况 1、奇数情况:在Len=2k+1的情况下,最高位为1,剩下2k位,至少需要k+1为0 用C(m,n)表示排列组合数:从m个位置选出n个位置的方法 R(len)=C(2k,k+1)+C(2k,k+2)+…+C(2k,2k). 由于 A:C(2k,0)+C(2k,1)+…+C(2k,2k)=2^(2k) B:C(2k,0)=C(2k

codeforces893E 2000分组合数学

放肆的年华 提交于 2020-02-03 04:45:06
题目传送门 题意: 一个正整数x,把x分解为y个整数,有多少种方案。 相同的数字,顺序不同,认为方案不同。 数据范围: 。 题解: 由唯一分解定理知: 。其中 是质数。 把x分解成y个整数等价于把每种质因子 分成y组,允许空组出现。 假设答案是 ,那么每种质因子对答案的贡献是 。 解释 :把 个质数分成 组,允许空组,那就相当于 个质数分为 组 ,不允许空组,因为你可以把每组减去1,那就出现了空组,所以是等价的。用隔板法得出该式。 由于负数的存在,并且x是正整数,所以y个数中有偶数个负数,最后 。 计算组合数时预处理出阶乘逆元会更快。每次都计算所需阶乘逆元是比较慢的。 感受: 学会了隔板法。 代码: #include<bits/stdc++.h> using namespace std ; typedef long long ll ; const int maxn = 105 ; const int maxm = 1005 ; const ll mod = 1e9 + 7 ; ll fac[2000005] ; ll inv[2000005] ; ll qpow(ll a , ll b) { ll ans = 1 ; while(b) { if(b & 1) ans = (ans * a) % mod ; b >>= 1 , a = (a * a) % mod ; } return

第五关——数论:组合数学

别来无恙 提交于 2020-02-01 23:29:01
20:44:00 你在台上唱着我的创作,布局谋篇像本悲情小说——许嵩《最佳歌手》 我的寒假,我美好的寒假啊啊啊 “其实我还蛮不想写你的,博客,可是没办法啊,谁叫我的寒假不要我了,我就只好要你了,博客” 目录 鸽巢原理 鸽巢原理推广 杨辉三角和二项式系数 容斥定理 卡特兰数 斯特林数 那接下来就要来看一下 鸽巢原理 (抽屉原理) 啦 也不知道发现它的人是不是看着别人鸽子的窝盯半天才发现的,人家鸽子会不好意思的啦! 定义:如果有n+1个鸽子要进n个鸽巢,则至少存在一个鸽巢种包含两个或更多的鸽子。 例题: (2010问题求解3)记T为一队列,初始时为空,现有n个总和不超过32的正整数依次入队。如果无论这些数具体为何值,都能找到一种出队的方式,使得存在某个时刻队列T中的数之和恰好为9,那么n的最小值是_________。 由题意可知bi取值范围为1-32,现将这32个数构造为集合{1,10},{2,11}, …, {8,17}, {18,27}, {19,28},…,{23,32} ,{24},{25},{26},这17个集合中的任一个集合不能包含两个或两个以上的 ,否则它们的差为9,故由鸽巢定理可得出,n的最小值为18. 应用: 在边长为1的正方形内任取5点,则其中至少有2点的距离不超过√2/2 例题: 吃糖果 这道题是典型的鸽巢原理,可用鸽巢原理一种简单的推理方法隔板法进行分析,如果S

组合数学里一些比较重要(有意思)的结论

孤街醉人 提交于 2020-01-29 11:46:08
1.过n个有标志顶点的树的数目等于n n-2 .(Cayley定理) 2.在n个不同元素中取r个作允许重复的组合,其组合数为C(n+r-1,r). 3.从A={1,2,…,n}中取r个作不相邻的组合,其组合数为C(n-r+1,r). 4.线性方程x 1 +x 2 +…+x n =b的非负整数解的个数是(n+b-1,b). 5.C(m+n,m)=C(m+n,n)=C(n,r)=C(n,n-r). 6.C(n,r)=C(n-1,r)+C(n-1,r-1)(杨辉三角、Pascal 三角) 牛顿二项式定理: 7.C(n+r+1,r)=C(n+r,r)+C(n+r-1,r-1)+C(n+r-2,r-2)+…+C(n+1,1),C(n,0). 8.C(n,l)*C(l,r)=C(n,r)*(n-r,l-r). 9..C(m,0)+C(m,1)+C(m,2)+…+C(m,m)=2 m . 10.C(n,0)-C(n,1)+C(n,2)+…±C(n,n)=0(由牛顿二项式定理代入可证) 11.C(m+n,r)=C(m,0)*C(n,r)+C(m,1)*C(n,r-1)+…+C(m,r)*C(n,0),r<=min(m,n). 12.(由上式可得)若m<=n,则有C(m+n,m)=C(m,m)*C(n,0)+C(m,m-1)*C(n,1)+…+C(m,0)*C(n,m)=C(m,0)*C(n,0)

必知C++算法之排列组合基本操作

风流意气都作罢 提交于 2020-01-23 18:58:03
概率组合题目分类 1.高中数学为基础的古典概率计算方法 2.斐波那契数列和卡特兰数 6x9的方格,从左上角到右下角,每次只能向下或向右,一共多少种不同走法 一共13步,五步向下,剩下8步向右 组合问题C13 5= C13 8=1287种 ABCDEFG七人站队,A必须在B的左边,求不要求相邻与必须相邻有多少种排法 不要求相邻:7!/2 = 2520种 要求相邻:把AB看成一个人即可,6!=720种 六个人排成一排,要求甲与乙不相邻,并且甲与丙不相邻的排法数是多少 方法一: 6个人全排列6! = 720 甲乙相邻(甲乙看成一个人):2*5! = 240 甲丙相邻:2*5!=240 甲与乙和丙都相邻的重复减去了一份(甲乙丙看成一个人):2*4! = 48 答案:720-240-240+48 = 288种 方法二: 甲在最左侧72种 同理,右侧72种 甲在中间4个任意位置,左右两边的可从非乙丙人员的3个人中抽2个(6种) 6x3!=36种,一共4个位置,36x4=144种 总数=72+72+144 = 288种 10颗相同的糖果,分给3个人,每人至少一颗,问有多少种分法 运用隔板法: 10个糖果中间的位置为9个,插入2个隔板,分成3分即可 组合问题 故为36种 10个不同的球,放入三个桶中 每个球有3种选择,故此为3的10次方 = 59049种 有10颗糖,如果每天至少吃一颗,吃完为止

组合数学之格路径和Schroder数

為{幸葍}努か 提交于 2019-12-26 23:52:44
参考博客:https://www.cnblogs.com/rhythmic/p/5988529.html 1.格路径 假设向上走为H,向右走为R,则从(r,s)到(p,q)的一条格路径为: H,R,H,R,H,R,H,R. 即从p+q-r-s中选p-r个H。 因此,从( r ,s )到(p,q)的矩形格路径的数目是等于二项式系数: 2.下对角线格路径 从(r,s)到(p,q)但不能经过x=y对角线的格路径叫做下对角线格路径。 p<q时,是不存在下对角线格路径。因此只考虑p>=q的情况。 当从(0,0)到(n,n)时,下对角线格路径数正是Catalan数。 当从(0,0)到(p,q)采用容斥原理,即不考虑x=y这条线的格路径数-经过x=y的格路径数L 很简单,就是下移后的路径与(1,0)到(p,q)的路径数相同。 蓝色的路径==紫色的路径 来源: CSDN 作者: 木子若鱼 链接: https://blog.csdn.net/jane_6091/article/details/103722957