组合数学
ITCharge
高效率编程,慢节奏生活。
展开
-
NEFU776 抓住奥斯卡【母函数】
题目大意:给你面值为1分、2分、5分的硬币,并且这些硬币的数量分别为N1,N2和N5。问:这些硬币最小不能表示的值为多少。思路:母函数问题,通过分析,可得:g(x) = (1+x+x^2+x^3+…+x^N1) * (1+x^2+x^4+…x^(2*N2) ) * (1+x^5+x^10+…x^(5*N5) )这些硬币能表示的最大值Max = N1 + N2*2 + N5*5。考虑1,2,…,Max,Max+1次幂的系数是否为令,找出这些硬币不能表示的最小的值。原创 2015-05-15 08:54:42 · 946 阅读 · 0 评论 -
容斥原理【模板】
容斥原理:在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。LL Q[100010],factor[110],num;//Q数组存放的就是右边边各项的因子数以及正负情况,f原创 2015-05-07 19:49:19 · 2272 阅读 · 0 评论 -
POJ1721_CARDS【置换群】
POJ1721_CARDS【置换群】原创 2014-09-16 22:05:13 · 1666 阅读 · 0 评论 -
POJ2369 Permutations【置换群】
题目大意:给定一个序列,问最少需要多少次置换才能变为 1、2、…、N 的有序序列。比如说给定5个数的序列 4 1 5 2 3,表示置换为:( 1 2 3 4 5 ) ,即 (1 4 2)(3 5) 4 1 5 2 3解题思路:对于每一位找到自己轮换内轮换到自己的次数,求不相交的轮换之间的次数的公倍数,即为最终结果。原创 2015-08-19 17:24:07 · 867 阅读 · 0 评论 -
POJ3370&HDU1808 Halloween treats【鸽巢原理】
题目大意:给你两个整数C和N,再给你N个正数的序列,从中找到若干数,使得其和刚好是 C的倍数。输出这些数的序号。解题思路:典型的抽屉原理。Sum[i]为序列中前 i 项的和。则有两种可能:1.若有 Sum[i] 是 C 的倍数,则直接输出前 i 项。2.如果没有任何的 Sum[i] 是 C 的倍数,则计算 ri = Sum[i] % C。根据鸽巢原理,肯定有 Sum[i] % C == Sum[j] % C,i != j。则第 j 到第 i 项数的和即为 C 的倍数。原创 2015-08-18 11:52:35 · 1592 阅读 · 0 评论 -
POJ3252 Round Numbers【组合问题】
题目大意:给你两个十进制数 A 和 B,求其对应闭区间 [A,B] 内有多少个Round Numbers。Round Numbers 是指:如果一个十进制数对应的二进制数中的 0 的个数多于 1 的个数,则该数就是一个 Round Numbers。解题思路:参考博文:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122758.html计算闭区间 [A,B] 内有多少个Round Numbers,只需要分别求出[0原创 2015-08-31 21:34:36 · 610 阅读 · 0 评论 -
POJ2356 Find a multiple【鸽巢原理】
题目大意:给你N个正数的序列,从中找到连续的若干数,使得其和刚好是N的倍数。解题思路:典型的抽屉原理。Sum[i]为序列中前i项的和。则有两种可能:1.若有Sum[i]是N的倍数,则直接输出前i项。2.如果没有任何的Sum[i]是N的倍数,则计算ri = Sum[i] % N。根据鸽巢原理,肯定有Sum[i] % N == Sum[j] % N,i != j。则第 j 到第 i 项数的和即为N的倍数。原创 2015-08-18 11:19:52 · 783 阅读 · 0 评论 -
HDU1028 Ignatius and the Princess III【母函数】【完全背包】
题目大意:给定正整数N,定义N = a[1] + a[2] + a[3] + … + a[m],a[i] > 0,1 <= m <= N。对于给定的正整数N,问:能够找出多少种这样的等式?思路:对于N = 4,4 = 4;4 = 3 + 1;4 = 2 + 2;4 = 2 + 1 + 1;4 = 1 + 1 + 1 + 1。共有5种。N=4时,结果就是5。其实就是整数分解问题,可写出母函数g(x) = (1+x+x^2+x^3+…)*(1+x^2+x^4+…)*(1+x^3+…)*(原创 2015-05-14 22:45:38 · 1117 阅读 · 0 评论 -
HDU1023 Train Problem II【Catalan数】
题目大意:一列N节的火车以严格的顺序到一个站里,问出来的时候有多少种顺序。解题思路:典型的求Catalan数的题目,但是结果会很大,所以需要用大数来解决。Catalan公式为 h(n) = h(n-1) * (4*n-2) / (n + 1),h(0) = h(1) = 1。原创 2015-08-17 10:26:34 · 652 阅读 · 0 评论 -
母函数【模板】
普通母函数 1.根据题目要求得到母函数(生成函数) 2.把第一个括号的表达式的系数赋值到c1中。 3.从第二个括号开始计算每一项乘积。 4.迭代得到最终母函数结果。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;int c1[1100],c2[1100]原创 2015-05-07 22:02:33 · 1190 阅读 · 0 评论 -
POJ1879 Tempus et mobilius Time and motion【置换群】
题目大意:有三条轨道,一个球库。球库有编号1~N的小球,按顺序排列。三条轨道分别是1 分钟单位的轨道,容量为 4;5 分钟单位的轨道,容量为 11;60 分钟的轨道,容量为 11。轨道可视为栈(先进后出)。每过 1 分钟,一个小球从球库中出来,球库可视为一个队列(先进先出)。小球先进入1 分钟轨道。如果 1 分钟轨道中已经有了 4 个,则这四个小球依次进入球库,而这个球进入 5 分钟轨道。如果 5 分钟轨道已经有了 11 个,则这 11 个球依次进入球库,而这个球进入 60 分钟轨道原创 2015-09-06 11:30:19 · 534 阅读 · 0 评论 -
POJ2409 Let it Bead【Polya定理】
题目大意:给定M种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为N的项链。问能做成多少种不重复的项链,最后的结果不会超过int类型数据的表示范围。并且两条项链相同,当且仅当两条项链通过旋转或是翻转后能重合在一起,且对应珠子的颜色相同。解题思路:Polya定理的应用。先来看Polya定理。Polya定理:设 G = {a1,a2,…,ag}是 N 个对象的置换群,用 M 种颜色给这 N 个对象着色,则不同的着色 方案数为: |G|^(-1) *原创 2015-08-20 11:31:48 · 4059 阅读 · 0 评论 -
POJ1286 Necklace of Beads【Polya定理】
题目大意:给定3种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为N的项链。问能做成多少种不重复的项链,最后的结果不会超过int类型数据的表示范围。并且两条项链相同,当且仅当两条项链通过旋转或是翻转后能重合在一起,且对应珠子的颜色相同。解题思路:这道题和POJ2409是一样的题目,只不过这道题规定了颜色数目。Polya定理的应用。先来看Polya定理。Polya定理:设 G = {a1,a2,…,ag}是 N 个对象的置换群,用 M 种颜色给这 N 个对象着色,则不同的着色 方原创 2015-08-20 18:48:54 · 1531 阅读 · 0 评论 -
HIT2813 Garden visiting【组合数】
题目大意:给你三个整数 N、M、P,求组合数 C(N+M-2,M-1) % P。解题思路:将阶乘表示为大整数分解的形式,将各个素因子按素因子的幂相乘起来就是所求答案(记得要对 P 取余)。原创 2015-11-15 17:12:29 · 662 阅读 · 0 评论 -
POJ3128 Leonardo's Notebook【置换群】
题目大意:给你一行共 26 个字母,代表一个置换。问:这个置换能否为某个置换平方的结果。解题思路:这道题可参考《置换群快速幂运算研究与探讨》,里边有详解。这里放上结论。结论一: 一个长度为 l 的循环 T,l 是 k 的倍数,则 T^k 是 k 个循环的乘积,每个循环分别是循环 T 中下标 i mod k=0,1,2… 的元素按顺序的连接。 结论二:一个长度为 l 的循环 T,gcd(l,k)=1,则 T^k 是一个循环,与循环 T 不一定相同。结论三:一个长度为 l 的循环 T,T^k原创 2015-10-28 21:25:08 · 1137 阅读 · 0 评论 -
FZU1753 Another Easy Problem【组合数】
题目大意:给你 T 个组合数 C(N,K),求这 T 个组合数的最大公约数。解题思路:将组合数用 素因子分解的形式来表示。然后求出每个素因子在公约数中最小的阶,相乘得到答案。原创 2015-11-13 17:57:51 · 824 阅读 · 0 评论 -
POJ1026 HDU1439 Cipher【置换群】
题目大意:给定一个n元置换Key,输出一个字符串(长度若小于n则用空格补齐)经过k次置换后的字符串思路:先求出Key[i]每个元素置换到自己本身的次数ChangeNum[i],如4 5 3 7 2 8 1 6 10 9中,4->7->1->4经过三次到循环,5->2->5经过两次到循环,7->1->4->7经过三次到循环。再将字符串补全,进行k % ChangeNum[i]次置换。原创 2014-09-15 11:04:32 · 1163 阅读 · 0 评论 -
POJ3270 Cow Sorting【置换群】【间接排序】
POJ3270_Cow Sorting【置换群】【间接排序】原创 2014-09-16 21:09:48 · 1331 阅读 · 0 评论 -
HDU1817 Necklace of Beads【Polya定理】
题目大意:给定3种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为N的项链。问能做成多少种不重复的项链,最后的结果不会超过int类型数据的表示范围。并且两条项链相同,当且仅当两条项链通过旋转或是翻转后能重合在一起,且对应珠子的颜色相同。解题思路:这道题和POJ2409是一样的题目,只不过这道题规定了颜色数目。Polya定理的应用。先来看Polya定理。Polya定理:设 G = {a1,a2,…,ag}是 N 个对象的置换群,用 M 种颜色给这 N 个对象原创 2015-09-07 20:03:04 · 1296 阅读 · 0 评论 -
ZOJ2835 Magic Square【幻方验证】
题目大意:给你一个N阶的矩阵,判断是不是N阶幻方。其中使用的数字不一定是1~N^2,但是数字一定不能有重复的。解题思路:根据幻方的定义,遍历判断下所有横行、竖行、斜行的和是否相等,并且用Flag[]数组来判断是否有重复数字存在。原创 2015-08-21 13:09:09 · 1460 阅读 · 0 评论 -
XMU1016 Magic Square【幻方构造】
题目大意:给你一个整数N,然后输出一个N阶幻方。解题思路:关于幻方,搜索肯定超时。但是我们可以直接构造一个幻方。就是根据奇数阶(2*M+1)幻方、单偶数阶(4*M+2)幻方、双偶数阶(4*M)幻方等不同的构造方法来构造。参考博客:http://blog.csdn.net/u012317281/article/details/380511851 奇数阶 (2*M+1) 幻方构造法 (1) 将 1 放在第一行最中间的一列上 (2) 从 2 开始直到 N*N 为止各数依次按下列规则存放:向右上方原创 2015-08-21 12:45:36 · 854 阅读 · 0 评论 -
POJ2154 Color【Polya定理】【欧拉函数】【整数快速幂】
题目大意:给定 N 种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为 N 的项链。问能做成多少种不重复的项链,最后结果对 P 取模。并且两条项链相同,当且仅当两条项链通过旋转后能重合在一起,且对应珠子的颜色相同。解题思路:Polya定理的应用。先来看Polya定理。Polya定理:设 G = {a1,a2,…,ag}是 N 个对象的置换群,用 M 种颜色给这 N 个对象着色,则不同的着色 方案数为: |G|^(-1) * {M^c(a1) +原创 2015-08-20 18:17:02 · 1001 阅读 · 0 评论 -
HDU3265 Examining the Rooms【stirling数】
题目大意:有N个房间,每个房间的要是随机放在某个房间内,概率相同。有K次炸门的机会。求能打开所有房间门,进入所有房间的概率有多大。解题思路:门和钥匙的对应关系出现环。打开一个门后,环内的门都可以打开。也就意味着:N个房间的钥匙与门形成1~K个环的概率有多大。也就是求N个元素,构成K个以内的环,且1不成自环的概率。N个元素形成K个环的方法数是第一类stirling数 S(N,K)。N个元素形成K个环,且1成自环的方法数是S(N-1,K-1)。则N个元素形成K个环,且1不成自环的方法数是S(原创 2015-08-17 09:27:22 · 625 阅读 · 0 评论 -
HDU1398 Square Coins【母函数】
题目大意:Silverland居住的人们使用方币,这种硬币的价值都是平方数。硬币的价值分别为1分、4分、9分,…,最大为289(17^2)分。要得到10分钱,共有四种硬币组合10个1分硬币、1个4分硬币和6个1分硬币、2个4分硬币和2个1分硬币,1个9分硬币和1个1分硬币。现在给你一个数,问:得到这个值,共有多少种不同的硬币组合方式。思路:典型的母函数问题。可列出母函数 g(x) = (1+x+x^2+x^3+…)*(1+x^4+x^8+…)*…*(1+x^289+x^578+…),用母函原创 2015-05-14 22:33:14 · 835 阅读 · 0 评论 -
HDU2841 Visible Trees【容斥原理】
题目大意:给一个含有N*M个点的矩阵,左下角的点为(1,1),右上角的点为(N,M),一个人站在(1,1)点看这些点,在一条直线上,他只能看到最前边的点,后边的点都被挡住看不到了。那么问题来了:这个人总共能看到多少个点?思路:发现一条线上的点,斜率都是一样的,后边的点都是最前边能看到点的倍数,能被看到的点都是横纵坐标公约数为1的点,即gcd(x,y) = 1,如果有一个点(x,y),有一个公约数d,即gcd(x,y) = d,那么,它就被前边(x/d,y/d)的点挡住了。问题就变求N*M个点原创 2015-03-26 22:42:37 · 1200 阅读 · 4 评论 -
Ural 1091 Tmutarakan Exams【容斥原理】
题目大意:给你两个整数K和S,从小于等于S的非负整数中选择K个数,并且K个数的最大公约数大于1,问总共有多少组。(2 <= K <= S <= 50)。解题思路:因为 2 <= K <= S <= 50,我们可以直接枚举质因数,求出从每个质因数的倍数中选择k个数的组合数,累加起来即为方案个数,但是这样重复计算了很多情况。例如:S = 20,K = 2。2的倍数:2、4、6、8、10、12、14、16、18、203的倍数:3、6、9、12、15、185的倍数:5、10、15、207的倍数原创 2015-08-11 11:38:35 · 652 阅读 · 0 评论 -
POJ1496 Word Index【全排列】
题目大意:和给你一个字符串str,输出str在字典序全排列中的位置(从小到大排列)。解题思路:和 POJ1850 一模一样。参考博文:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122771.html先判断str是不是升序序列,如果是升序序列,则为字典序的第1个,输出1。不符合第一步的话,则分为两步计算str的字典序位置。先计算比 str 的长度少的字符串总个数。再计算长度和 str 一样,比 str 字典序的字符串原创 2015-08-25 21:11:46 · 773 阅读 · 0 评论 -
HDU2512 一卡通大冒险【斯特灵数,贝尔数】
题目大意:有N张卡,将N张卡分成若干不同的集合,集合不能为空。问:总共有多少种分法。思路:参考博文:http://blog.csdn.net/acm_cxlove/article/details/7857671集合的个数可以为1、2、3、…、N。问题就变为了把N张卡放到i个集合中。这时候个组合问题,可以用第二类斯特灵数解决。S(P,K) = S(P-1,K-1) + K*S(P-1,K);表示P个元素放入K个不可区分的集合中而集合不为空的划分个数。问题的解就为: ΣS(P,i),(1 <=原创 2015-04-05 23:47:37 · 1157 阅读 · 0 评论 -
POJ1423 HDU1018 Big Number【斯特林公式】【高精度】
题目大意:求N!有多少位。1<=N<=10^7。思路:N的规模很大。不能直接模拟求位数。先考虑这种做法:设A = N! = 1*2*3*4*…*N,那么位数就是(int)log10(A) + 1而(int)log10(A) = log10(1*2*3*…*N) = log10(1) * log10(2) * log10(3) * … * log10(N)这样累加起来就是结果了。不过因为N是10^7规模的,所以这样累加在HDU上可以AC,但是POJ上还是超时的。应该用斯特林公式来做。Sti原创 2015-04-14 18:22:19 · 1187 阅读 · 0 评论 -
HDU1695 GCD【容斥原理】【欧拉函数】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695题目大意:给你5个整数a、b、c、d、k,在区间[a,b]中选一个数x,在区间[c,d]中选一个数y,使得x和y的公约数为k,即gcd(x,y) = k。现在问题来了:这样的整数对共有多少对。思路:题目假定a = c = 1,那么区间就变为了[1,b]和[1,d...原创 2019-12-06 10:23:00 · 1399 阅读 · 1 评论 -
HDU4135 Co-prime【容斥原理】
题目大意:给一个区间[a,b],从区间[a,b]中找出共有多少个数是与n互质的。思路:欧拉函数得到的是小于n与n互质的个数,这里是个区间。由于区间较大,不可能对[a,b]进行遍历,考虑计算区间[1,a-1]中与n互质的个数num1,[1,b]中与n互质的个数num2,最终结果就是两者相减的结果。现在考虑如何计算区间[1,m]中n互质的个数num,num等于 (m - 与n不互质的个数)。与n不互质的数就是[1,m]中n的素因子的倍数。例如m = 12,n = 30的情况。30的素因子数为原创 2015-03-26 16:16:13 · 2217 阅读 · 0 评论 -
HDU4336 Card Collector【容斥原理】
题目大意:每包零食里有一张卡牌,总共有N种不同的卡牌,得到这N种卡牌的概率分别为P[i](1 <= i <= N)。求收集到所有卡牌的期望是多少。思路:Pi表示得到第i张卡牌的概率,Ei表示得到第i张卡的期望。假设现在有两张卡牌,由题意可知:E1 = 1/P1,E2 = 1/P2,E12(表示肯定买到1或2其中一包的期望) = 1/(P1+P2)。当我们计算E1和E2的时候,E12是重复计算了2次,应该减去一次。根据容斥定理可知:E = E1 + E2 - E12。同理,三张牌的时候:原创 2015-08-11 09:15:19 · 1997 阅读 · 0 评论 -
HDU5194 DZY Loves Balls【排列组合】
题目大意:袋子里有N个黑球、M个白球。用1表示取出来的是黑球,0表示取出来的是白球。不放回的从袋子里取出这N+M个球。求相邻取出的两个球第一个球白球,第二个球是黑球的期望次数是多少,即出现"01"的期望次数是多少。思路:考虑期望可加。第i(1<=i<=N+M)个位置上出现白球的概率为M/(M+N),则i+1个位置上出现黑球的概率为N/(M+N-1)。因为白球只能在1~M+N-1个位置上出现(后边还有黑球)。所以出现"01"的次数为(M+n-1)次。则总的期望 = M/(M+N原创 2015-04-24 20:31:16 · 1267 阅读 · 0 评论 -
HDU1796 How many integers can you find【容斥定理】
题目大意:给你一个整数N,和M个整数的集合{A1、A2、…、Am},集合内元素为非负数(包含零),求小于N的正整数(1~N-1)中,能被M个整数的集合中任意一个元素整除的正整数个数。例如N = 12,M = {2,3},在1~N-1中,能被2整除的数为{2,4,6,8,10},能被3整除的数为{3,6,9}。则所求集合为{2,3,4,6,8,9,10},共7个,则答案为7。思路:就是求M个集合的并集。先看上边的例子,能被2整除的数集合S1为{2,4,6,8,10},能被3整除的数集合S2为{原创 2015-08-11 10:24:53 · 703 阅读 · 0 评论 -
ZOJ2836 Number Puzzle【容斥原理】
题目大意:给N个整数,和一个整数M。求小于等于M的非负整数(1~M)中能被这N个数中任意一个整除的数的个数。解题思路:设S1为1~M中能被第一个整数A1整除的集合,S2为1~M中能被第二个整数A2整除的集合。……Sn为1~M中能被第N个整数An整除的集合。然后每个集合个数,其实就是M / An。再根据容斥原理,求集合并集的元素个数即可。原创 2015-08-11 19:40:24 · 892 阅读 · 0 评论 -
POJ1850 Code【全排列】
题目大意:给你一个字符串str,输出str在字典序全排列中的位置(从小到大排列)。解题思路:参考博文:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122760.html先判断str是不是升序序列,如果是升序序列,则为字典序的第1个,输出1。不符合第一步的话,则分为两步计算str的字典序位置。先计算比 str 的长度少的字符串总个数。再计算长度和 str 一样,比 str 字典序的字符串的个数。先来看第一原创 2015-08-25 21:01:16 · 1442 阅读 · 0 评论 -
HDU2079 选课时间(题目已修改,注意读题)【母函数】
题目大意:给你各种学分的课程数,问:选课凑够N学分的情况有多少种。给你两个整数N和K,N表示要凑够的学分数。K表示接下来K行,每行为两个整数a和b。表示学分为a的课程有b们。求出选够N学分的方案数有多少种。思路:可以用母函数做,也可以用多重背包来做。这两种做法,感觉实质上没什么区别吧。多重背包用滚动数组优化一下也是一样的。这里用母函数来解决。这是一道母函数的模板题,关于母函数,网上有好多资料,就不再描述了。原创 2015-04-09 11:46:49 · 1039 阅读 · 0 评论 -
HDU2110 Crisis of HDU【母函数】
题目大意:公司有N种价值的资产,每种价值的资产数量已知,问能否得到总资产1/3的分割资产方法。问:分割资产的方案数是多少(mod 10000)。思路:给定N种价值的资产,设每种价值Pi的数量为Mi,则总资产为sum = Σ Pi*Mi (1 <= i <= N)。可得母函数g(x) = Π(1 + x^Pi + x^(2*Pi) + … + x^(Pi*Mi) ) (1 <= i <= N)。找到sum/3的系数即可。原创 2015-05-15 09:34:09 · 1040 阅读 · 0 评论 -
HDU1709 The Balance【母函数】
题目大意:现有一个天平和不同质量的砝码,每个质量的砝码只有一个,且令S为这些砝码质量的总和。现在,从1~S中,找到用这些砝码不能称出的物品质量。思路:每种砝码既可以放在右盘,又可以放在左盘,如果视作左物右码的话,砝码放在左边取减号,放在右边取加号。最终将指数看为正数,求得的系数要求绝对值。放在同一端c2[j+k] += c1[j];放在不同端c2[abs(k-j)] += c1[j]。原创 2015-05-15 10:39:16 · 1173 阅读 · 0 评论 -
HDU1521 排列组合【指数型母函数】
题目大意:有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。思路:典型的指数型母函数。指数型母函数的一般问题为:n个元素组成的多重集,其中a1重复了n1次,a2重复了n2次,…,ak重复了nk次。若n = n1 + n2 + … +nk,从n个元素中取r个排列,求不同的排列数。原创 2015-08-17 19:16:11 · 801 阅读 · 0 评论