
组合数学
文章平均质量分 83
cillyb
这个作者很懒,什么都没留下…
展开
-
hdoj 2082 找单词(母函数)
用母函数找出组成的价值 代码: #include using namespace std; const int maxn = 105; int num[30], c1[maxn], c2[maxn]; int main(void) { int t; cin >> t; while(t--) { for(int i = 1; i <= 26原创 2016-10-26 21:31:45 · 469 阅读 · 0 评论 -
Codeforces Round #439 (Div. 2) C. The Intriguing Obsession(组合数)
题意:有三种颜色的点,告诉你三种颜色的点的个数a,b,c,问你有多少种方式建边,要求是相同颜色的点不能到 达,或者相同颜色点互相到达的距离至少为3,每条边的长度为1。 (a, b, c 思路:我们知道同一颜色的点之间是不可能建边的,所以我们可以两两颜色之间考虑。对于颜色a,b之间,我们可以 知道一个点不可能连两条边,因为如果一个点连两条边这样相同颜色距离就为2了。所以每个点只能连对原创 2017-10-07 00:19:54 · 298 阅读 · 0 评论 -
HDU 5738 Eureka (共线点集 组合数)
题意:给你n个点,要求一个点集中所有点共线(可有重点)。问有多少的这样的集合。 思路: 1. 先将所有点排个序,这样可以保证向量都是非负的,去除相反向量带来的影响。 2. 用gcd的方式将向量的值最小化,使相同向量的唯一性。 3. 枚举每个点进行单独讨论,统计这一个点对总答案的贡献度。 (计算贡献时用到这:cn0+cn1+cn2+cn3+…+cnn=2^n) 代码:原创 2017-08-31 12:45:06 · 365 阅读 · 0 评论 -
CodeForces 839D Winter is here(数学 容斥)
题意:给你n个数,问你所有满足gcd>1的子集,每个子集贡献为子集内元素个数*子集gcd,问所有满足条件的集合的 贡献和。 思路:可以枚举gcd,计算每个gcd的贡献,设含因子i的个数为cnt[i], gcd为i的贡献个数为1*C(cnt[i], 1) + 2*C(cnt[i], 2) + 3*C(cnt[i], 3) ... + cnt[i]*C(cnt[i], cnt[i]))原创 2017-08-13 19:44:07 · 454 阅读 · 0 评论 -
2017 Multi-University Training Contest - Team 2 1009 HDU 6053 TrickGCD(分段 容斥)
题意:给你n个数字,每个位置的数可以小于等于a[i],求所有区间gcd(l,r)都满足大于等于2的方案数 思路:我们可以枚举gcd,然后a[i]/gcd就是i位置能够填的数的个数,然后每个位置累乘起来就能得到数列为gcd时的方案数。但是这 样是n^2复杂度,显然会T,因为a[i]/cgd有许多是相同的,我们可以将相同的一起考虑,这可以用前缀和和快速幂解决。这样算完之 后显然计算了许多原创 2017-07-28 14:29:28 · 813 阅读 · 0 评论 -
2017 Multi-University Training Contest - Team 8 1011& HDU6143 Killer Names(容斥|| 第二类斯特林数)
题意:给你m种字符,让你填充两个长度为n的字符串,要求两个字符串不能有相同的字符,问最多有多少种填法。 n,m 思路:解这题的关键是解决用恰好k个字符去填充长度为n的字符有多少种方案。比赛时知道容斥可以做,但没想出 来。。所以用了第二类斯特林去做,第二类斯特林数(点击打开链接):把p元素集合划分到k个不可区分的盒子里且 没有空盒子的划分个数。在这就是看作n个位置填充k个颜色,因为颜原创 2017-08-17 20:53:37 · 357 阅读 · 0 评论 -
卡特兰数知识
讲的挺好的样子,先收藏下,有空慢慢看。 http://www.cnblogs.com/wuyuegb2312/p/3016878.html#suggestion原创 2016-07-04 16:18:34 · 669 阅读 · 0 评论 -
HDU 3723 Delta Wave(卡特兰数+大数)
题意:从坐标(0, 0)到(n, 0)的折线,这条折线每向右延伸一个单位长度,高度要么不变,要么+1,要么-1,(不能到y=0以下)已知n,求这种折线种数 思路:我们知道上升和下降的次数要一样,而这就像卡特兰数的入栈出栈次序一样,所以我们从n中选出2k次进行类出栈模拟, 那么ans[k] = C[n][2k]*C[2k][k]/(k+1),计算组合数n^2会T,然后我们可以相除ans[k-1]原创 2017-04-25 17:04:35 · 612 阅读 · 0 评论 -
HDU 4828 Grids(卡特兰数)
题意:一个2行N列的长方形格子。把1到2N这些数依次放进去,求每行每列都递增的方案数(对1e9+7取模)。(n 思路:1到2N一个个放,有两种情况,放第一行或者放第二行,可以发现要满足每行每列都递增的要求是放的过程中第一行的数大于等于第二行的数。这很类似于台阶问 题:在一个n*n的格子中,我们从左下角出发,前往右上角,每一步,只能水平向右走一格,或者垂直向上走一格,并且不能越过对角线原创 2017-05-15 18:53:23 · 592 阅读 · 0 评论 -
HDU 5894 hannnnah_j’s Biological Test(组合数学 逆元)
题意:现在 m个考生人需要坐在有n个座位的圆桌上。你需要安排位置,使得任意两个考生之间相距至少k个位置。桌子有编号,考生a和b交换位置视作一种方案,问有多少方案,mod 1e9+7。(0 思路: 定好m个人 相邻人之间k个座位 剩下就剩n-(m+1)*k个座位 剩下座位去插m个不同的盒子==就等价n个相同的球放m个不同的盒子 然后组合数出来了 乘n的话是枚举座位,除m是原创 2017-05-15 16:41:53 · 530 阅读 · 0 评论 -
第一类,第二类Stirling数,Bell数
一.第二类Stirling数 定理:第二类Stirling数S(p,k)计数的是把p元素集合划分到k个不可区分的盒子里且没有空盒子的划分个数。 证明:元素在拿些盒子并不重要,唯一重要的是各个盒子里装的是什么,而不管哪个盒子装了什么。 递推公式有:S(p,p)=1 (p>=0) S(p,0)=0 (p>=1)转载 2017-05-04 14:24:17 · 732 阅读 · 0 评论 -
UVALive 5002/ lightoj 1382 The Queue(树形DP)
题意:有n个人,除BOSS外,每个人都有一个上司,现在要排队,每个人都不能排在自己的上司前面,问有几种排法。 思路参考大神的吧: 首先求出以每个结点为根的子树大小,记为size[u],这个DFS一遍就可以求出来; 接下来,dp[u]表示给以u为根的子树size[u]个编号有几种编号方案 ; 然后考虑转移方程: 比如一个结点u有3个儿子v1,v2,v3,原创 2017-04-03 21:30:42 · 473 阅读 · 0 评论 -
hdoj 2204 Eddy's爱好(容斥)
http://acm.hdu.edu.cn/showproblem.php?pid=2204 给定n,求1-n中有多少个可以表示成M的K次方的数。K>1 题意很简单,但是怎么想?题面上说到了素数,第一想法就是K从素数开始枚举! 当K不是素数时,必然是重复算过的!比如K=6时,一定会有一个(M1的2次方)的3次方=(M2的3次方)的2次方 那么,最大素数是多少?n最大值是1e原创 2017-02-08 22:14:53 · 450 阅读 · 0 评论 -
51nod - 1284 2 3 5 7的倍数(容斥)
同hdoj 1796 点击打开链接 #include #include #include using namespace std; typedef long long ll; ll a[4] = {2, 3, 5, 7}; ll n, ans; void dfs(ll cur, ll lcm, ll id) { lcm = a[cur]/__gcd(a[cur], lcm)*l原创 2017-02-06 13:16:29 · 566 阅读 · 0 评论 -
hdoj 1796 How many integers can you find(容斥原理)
题目地址:点击打开链接 题意:给定n和一个大小为m的集合,集合元素为非负整数。为1…n内能被集合里任意一个数整除的数字个数。n 解题思路:容斥原理地简单应用。先找出1...n内能被集合中任意一个元素整除的个数, 再减去能被集合中任意两个整除的个数,即能被它们两只的最小公倍数整除的个数,因为 这部分被计算了两次,然后又加上三个时候的个数,然后又减去四个时候的倍数.原创 2016-11-23 23:02:29 · 559 阅读 · 0 评论 -
hdoj 1709 The Balance(母函数)
因为是天平,所以组合之间的差值也都是可以得到的,这差值也是新的组合数。 代码: #include #include #include using namespace std; const int maxn = 1e4+5; int n, c1[maxn], c2[maxn], num[maxn], ans[maxn]; int main(void) { while(cin >>原创 2016-10-27 15:53:50 · 566 阅读 · 0 评论 -
hdoj 1171 Big Event in HDU(母函数/多重背包)
题意很简单,n种物品,每个物品对应一个价值和数量。让你竟可能的分成相等的两份。 可以设背包容量为sum/2用多重背包解决。 也可以用母函数来解决,计算能组成的最接近sum/2的值。 母函数可以解决很多背包问题。。但是速度一般比用dp做慢好多。。 母函数代码:1800ms #include using namespace std; const int原创 2016-10-26 21:13:37 · 712 阅读 · 0 评论 -
HDU 4810 Wall Painting(异或 组合数)
题意:求n个数里面,取k个数异或的所有组合(Cn,k种)的和,k取1~n 思路:枚举k,因为是异或,所以看二进制,最后的和的每一位二进制的值为n个数这一位的二进制取k个时1的个数为 奇数的方案数,那怎么计算n个0或1的数中取k个,取到的1的个数为奇数呢,比如有num1个1,num0个0,那么取k个 的方案中取出的是奇数个1的方案数位C(num1,1)*C(num0, k-1)+C(n原创 2017-09-30 22:48:00 · 397 阅读 · 0 评论