组合数学
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj3622 已经没有什么好害怕的了(dp+容斥原理)
首先设a组糖果比药片大,b组药片比糖果大,然后要求a-b=K,a+b=n,显然有a=(n+K)/2 于是就是求恰好a组糖果比药片大的方案数。 我们dp处理出至少j组的”方案数” 首先把a,b数组均排序,处理出每个糖果i大于的药片个数w[i],然后f[i][j]表示前i个糖果,选出了j组符合条件的。 f[i][j]=f[i−1][j]+f[i−1][j−1]∗(w[i]−j+1)f[i][j...原创 2018-06-20 17:20:42 · 282 阅读 · 0 评论 -
bzoj4735 你的生命已如风中残烛(组合数学)
就是给定我们m个数,不是正数就是-1,把每一个正数-1,那么这m个数和为0,要求每一个前缀和都要>=0,问方案数。 我们再在末尾加一个-1,那么就是要求这m+1个数除了最后一个位置外,其余位置的前缀和均>=0.这m+1个数的环排列个数为m!,可以证明,对于每一个环排列,有且仅有一种方式把它断开。又因为我们强行要求最后一个-1是我们多填上去的。因此答案就是m!m−n+1m!m−n+1\...原创 2018-05-25 15:47:31 · 463 阅读 · 0 评论 -
bzoj4517 [Sdoi2016]排列计数(错排+组合数学)
错排。 递推公式:Dn=(n−1)(Dn−1+Dn−2),D1=0,D2=1D_n=(n-1)(D_{n-1}+D_{n-2}),D_1=0,D_2=1 通项公式:Dn=n!∑k=2n(−1)kk!D_n=n!\sum\limits_{k=2}^n\frac{(-1)^k}{k!} 可以用容斥原理来理解。此题答案就是CmnDn−mC_n^mD_{n-m}原创 2018-04-28 13:38:06 · 246 阅读 · 0 评论 -
51nod1228 序列求和(伯努利数+数学)
求S(n,k)=∑i=1nikS(n,k)=\sum\limits_{i=1}^ni^k 可以O(k2)O(k^2) 递推。 用伯努利数可以做到O(k)O(k) ∑i=1nik=1k+1∑i=1k+1Cik+1∗Bk+1−i∗(n+1)i\sum\limits_{i=1}^ni^k=\frac{1}{k+1}\sum\limits_{i=1}^{k+1}C_{k+1}^i*B_{k+1-i}*原创 2018-05-02 09:04:37 · 543 阅读 · 0 评论 -
bzoj2142 礼物(扩展Lucas+CRT)
给定n个物品,分给m个人,每个人拿到wi个礼物,问方案数mod P P不一定为质数首先我们把剩下的礼物也分给一个人 答案明显不变 w[++m]=n-w1-w2-…-wm 那么显然答案就是Cw1nCw2n−w1⋯Cwmn−w1−...−wm−1C_n^{w_1}C_{n-w_1}^{w_2}\cdots C_{n-w_1-...-w_{m-1}}^{w_m},也就是n!w1!w2!⋯wm!%P\fr原创 2018-04-04 15:44:35 · 379 阅读 · 0 评论 -
bzoj3027 [Ceoi2004]Sweet(生成函数+组合数学+爆搜)
首先我们可以写出每一种糖果的生成函数,然后写成闭形式,乘起来,就得到了 ∏i=1n(1−xmi+1)(1−x)n\frac{\prod\limits_{i=1}^n(1-x^{m_i+1})}{(1-x)^n} 答案就是xa...xbx^a...x^b的系数和。 上式的分子部分我们可以O(2n)O(2^n)爆搜,搜出每一项kxykx^y 考虑剩下的部分(11−x)n(\frac{1}{1-x原创 2018-04-11 09:50:37 · 334 阅读 · 0 评论 -
bzoj1488 [HNOI2009]图的同构(群论+组合数学+polya)
感觉我的排列组合需要回炉重造一下了qaq求不同构的n个点的简单图的种类数。因为每条边有存在或不存在两种选择,所以可以转化为完全图上对边的2染色计数。但是我们只能处理点的置换(就是个n次对称群),而对于边的置换我们就很gg了。我们考虑对于一个点的置换,能否直接得出这种情况下的边的置换。每条边无非两种情况: 1、两点处在同一循环节中 2、两点处在不同循环节中 我们考虑一个长度为x的循环节内部,边的原创 2018-03-27 22:29:44 · 496 阅读 · 0 评论 -
uva11255 Necklace(polya+组合数学)
三种颜色的珠子分别有a,b,c颗,用这些珠子能串成多少种不同的环?考虑翻转同构,旋转同构。(3<=a+b+c<=40)我们先搞出置换群G,这次不同的是我们的集合M有了限制,但不要紧,我们还是要求G中每个置换下的不动点个数的算术平均数。先考虑旋转同构: 还是考虑有k个循环节,那么每个循环节的长度len=n/k。每个循环节内的颜色都必须相同,这也就意味着每种颜色的个数一定要是len的倍数,否则一定不存原创 2018-03-27 13:41:41 · 368 阅读 · 0 评论 -
bzoj3771 Triple(生成函数+FFT+组合数学)
首先1个的直接统计 将所有的数搞成一个生成函数,做一遍卷积搞出来选2个的答案 但是2个的存在选了两个相同的,或者选了一个排列,直接除2即可 然后生成函数卷两次统计选3个的答案 这里需要容斥一下,(选3个的答案-强行选了2个一样的*3+强行选了3个一样的*2)/6才是不考虑顺序、选不重复的3个的答案 强行选了3个一样的直接枚举,强行选了2个一样的就将每一个数的两倍搞成生成函数再和...原创 2018-04-02 11:55:02 · 333 阅读 · 0 评论 -
bzoj5339 [TJOI2018]教科书般的亵渎(伯努利数)
可以发现结果就是求若干S(n,k)=∑i=1nikS(n,k)=∑i=1nikS(n,k)=\sum\limits_{i=1}^ni^k 可以用伯努利数快速计算,见:portal#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define ll ...原创 2018-05-21 23:12:02 · 419 阅读 · 0 评论 -
loj6432「PKUSC2018」真实排名(线段树+组合数学)
分i有没有被选讨论一下就好了qaq 写了个线段树果然垫底了qaq#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 100010#define mod 998244353inline char gc(){ static c...原创 2018-06-06 15:39:55 · 558 阅读 · 0 评论 -
loj2540「PKUWC2018」随机算法(状压dp+组合数学)
设f[i][S]表示答案集合S大小为i,不可选的点的状态为S的方案数。 考虑在答案集合中再加入一个j来转移,本来还剩x个点可以选,选了j以后少了y个点可以选,那么这y个点可以随便放在排列的这x个位置之中,方案数为AyxAxyA_x^y。 复杂度O(2nn)O(2nn)O(2^nn)#include <bits/stdc++.h>using namespace std;#de...原创 2018-06-07 12:11:30 · 580 阅读 · 0 评论 -
bzoj4710 [Jsoi2011]分特产(容斥原理+组合数学)
题目要求有0个人有0个。 我们枚举有i个人有0个来容斥,其余的人随意分,用插板法来计算方案数。 Ans=∑i=0n−1(−1)iCin∏j=1mCn−i−1aj+n−i−1Ans=∑i=0n−1(−1)iCni∏j=1mCaj+n−i−1n−i−1Ans=\sum\limits_{i=0}^{n-1}(-1)^iC_n^i\prod\limits_{j=1}^mC_{a_j+n-i-1}^{n...原创 2018-06-20 08:18:13 · 306 阅读 · 0 评论 -
bzoj5306 [Haoi2018]染色(容斥原理+ntt)
一个不会数数的老年咸鱼选手的学习经历x首先我很快的得到了一个式子:Cim∗n!(s!)i∗(n−is)!∗(m−i)n−isCmi∗n!(s!)i∗(n−is)!∗(m−i)n−isC_m^i*\frac{n!}{(s!)^i*(n-is)!}*(m-i)^{n-is} 但是我说不出它的意义…感觉很重复x,需要容斥x 然后就傻掉了gg其实可以按套路来,给每一项设一个容斥系数b[i], ...原创 2018-06-19 22:55:56 · 324 阅读 · 0 评论 -
CF403D Beautiful Pairs of Numbers(计数,dp+组合数学)
首先做一个dp f[i][j]f[i][j]f[i][j]表示区间总长度为i,有j个区间,且任意两个区间的长度不同的方案数。两种转移:1、每个区间的长度都增加1,f[i][j]−>f[i+j][j]f[i][j]−>f[i+j][j]f[i][j]->f[i+j][j] 2、每个区间长度都增加1,并新增一个长度为1的区间,f[i][j]−>f[i+j+1][j+1]f[i][...原创 2018-06-23 21:14:08 · 481 阅读 · 0 评论 -
bzoj5305 [Haoi2018]苹果树(组合数学)
首先n个点的这样生成的二叉树有n!种。 因此这就不再是一个期望问题,而是计数问题! 可能没逆元,烦躁qaq 考虑给每个点按生成顺序标号,我们来计算i->fa[i]这条边对答案的贡献。 我们枚举i的子树大小j,那么这条边就会被经过j*(n-j)次。 再考虑i子树内部形态数和外部形态数。 i子树内部形态数显然是j!∗Cj−1n−ij!∗Cn−ij−1j!*C_{n-i}^{j-1}。...原创 2018-06-15 21:09:07 · 689 阅读 · 0 评论 -
luogu4714 「数学」约数个数和(组合数学+miller_rabin判素数)
luogu6月月赛E。 当时绝对是脑抽了 其实O(wK)O(wK)O(wK)的暴力递推还是可以写的呀… 令n=∏pqiin=∏piqin=\prod p_i^{q_i} 我们发现可以分开讨论每一个pqiipiqip_i^{q_i},最后乘起来就好了,且只跟次数q有关 设f[k][q]f[k][q]f[k][q]表示pqpqp^q的k次因数个数。 那么有递推式f[k][q]=∑i=0qf...原创 2018-06-23 17:43:10 · 329 阅读 · 0 评论 -
bzoj4767 两双手(dp+容斥+组合数学)
在二维平面上,你一开始在(0,0),给定两个向量,问你有多少种不经过坏点的方式到达(x,y)。 对于每一个点都求出需要走几个向量1,几个向量2,显然是唯一的。如果不合法直接跳过。 然后就转化成了类似上一题的模型。dp+容斥+组合数学解决。#include <bits/stdc++.h>using namespace std;#define ll long long#def...原创 2018-06-01 14:29:58 · 311 阅读 · 0 评论 -
Wannafly挑战赛18
https://www.nowcoder.com/acm/contest/129#question A.序列(组合数学) -2和0.5一样多,且都为偶数,枚举一下具体个数就好了 O(n)O(n)O(n) 考时ZZ了,不会跳了过去…很久以后才A掉gg B.随机数(矩阵快速幂) 设f[i]表示前i个数有奇数个1的概率,则 f[i+1]=f[i]∗(1−p)+(1−f[i])∗pf[i+1...原创 2018-06-22 23:09:24 · 305 阅读 · 0 评论 -
bzoj3782 上学路线(dp+容斥+组合数学+Lucas+CRT)
把终点也视为一个坏点的话,f[i]表示到达坏点i且不经过其他坏点的方案数。直接计算f[i]比较困难,考虑容斥。 可以通过组合数学方便的得到从一个点到另一个点的总方案数。那么我们可以再枚举经过的第一个坏点来减去不合法的方案。 这里算组合数需要Lucas定理,1019663265=3*5*6793*10007不是质数,但好在次数都是1,我们对每一个质因子算一下再CRT合并起来即可。 复杂度O(n...原创 2018-06-01 11:45:51 · 325 阅读 · 0 评论 -
bzoj4001 [TJOI2015]概率论(生成函数)
我以为我不会忘记的qaq 还是写一写推导吧qaq,方便后人 首先设hn表示n个节点的二叉树的形态数 那么我们有hn=∑i=1n−1hi∗hn−1−i,h0=1,h1=1h_n=\sum\limits_{i=1}^{n-1}h_i*h_{n-1-i},h_0=1,h_1=1 写出hnh_n的生成函数:f(x)=1+x+2x2+5x3+...f(x)=1+x+2x^2+5x^3+... f2(原创 2018-04-02 10:28:20 · 401 阅读 · 0 评论 -
bzoj4555 [Tjoi2016&Heoi2016]求和(斯特林数+ntt)
我会ntt?假的。我会多项式求逆?假的。我会斯特林数?假的。官方给的题解是cdq+ntt或者多项式求逆,然而我不会gg 还好还有一种可以直接ntt的,给跪orzAns=∑i=0n∑j=0iSi,j×2j×(j!)Ans=\sum\limits_{i=0}^n\sum\limits_{j=0}^iS_{i,j}\times2^j\times(j!) Si,j=1j!∑k=0j(−1)kCkj(j−原创 2018-04-01 16:41:22 · 263 阅读 · 0 评论 -
Codeforces Round #447
CF894A QAQ(暴力枚举/前缀后缀)CF849B Ralph And His Magic Field(数论,组合数学,快速幂)CF849C Marco and GCD Sequence(数论+构造)原创 2017-11-20 22:07:07 · 281 阅读 · 0 评论 -
CF486D Valid Sets(枚举+树形dp)
我还在想没给定根怎么能树形dp呢。。。我们枚举每一个i来当跟,然后每次统计过根且a[i]为最大值的方案数。考虑到如果a[i]!=a[j],则一定不会重复计数。那可能重复的就是a[i]==a[j]的情况,那我们强制规定一个方向,让标号小的能访问到相等的大的即可。这样就不会重复计数了。原创 2017-10-15 21:39:07 · 407 阅读 · 0 评论 -
NOIP模拟10.31 R2
2016提高D2 A.组合数问题。AC B.蚯蚓 水了60 C.愤怒的小鸟。。写过了。。结果还是被卡了精度5分。原创 2017-10-31 20:27:48 · 400 阅读 · 0 评论 -
CF870E points, Lines and Ready-made Titles(并查集+图论+快速幂)
我们把每条线看做并查集上的一个点,那么图上的每个点相当于连接了两条线。我们去维护一下每个联通快内有多少条边,是否有环。如果没环,也就是n个点,n-1条边,是一棵树,由于每条边最多只能贡献一个点,所以显然不能实现n个点的情况。总情况数为2^n -1。如果有环,可以实现所有情况,总情况数为2^n。都乘起来就好了。(显然互不影响的边只要用乘法原理乘起来就好啦)orz leoly原创 2017-10-18 10:44:23 · 432 阅读 · 0 评论 -
Codeforces Round #439
CF869A The Artful Expedient(暴力/异或性质)CF869B The Eternal Immortality(数学+模拟)CF869C The Intriguing Obsession(组合数学/dp)原创 2017-10-07 15:21:01 · 338 阅读 · 0 评论 -
bzoj1491 [NOI2007]社交网络(Floyd+组合数学)
在进行Floyd的同时记录最短路的条数。最后扫一遍,看k是不是i,j的中转点,是的话,加上他的重要度(用乘法原理算出)。原创 2017-09-12 08:45:23 · 341 阅读 · 0 评论 -
bzoj1016 [JSOI2008]最小生成树计数(kruskal+dfs+乘法原理)
首先需要一个结论,对于一个图的不同最小生成树,每种方案所包含的每种权值的边的数量一定一致。换句话说,把每种方案包含的所有边的边权都写下来,写出来的序列一定都一样。关于这个结论的说明放在最后。 这样的话,可以先做一遍kruskal,记下每种边权的使用次数,然后对于每种边权进行dfs,判断有多少种合法的组合方式【一种方案合法意味着:1.加入每条边时,边的两端点一定属于不同的并查集,也就是仍然要符合k原创 2017-09-27 22:46:04 · 341 阅读 · 0 评论 -
CF840C On the Bench(dp+组合数学)
首先我们对n个数进行一个分组,把乘积为平方数的数分在一组(可以证明:同一组内的数两两乘积为平方数,不同组的两个数乘积一定不是平方数),记作一共分了nn组,则同组的数只要不相邻即可满足题意。即原问题转化为 n个物品,分成了nn组,要求同组物品不能相邻,问共有几种排列方案。我们dp解决这个问题,f[i][j]表示前i组,有j个相邻的同组的方案数。 我们现在考虑插入第i组,第i组的大小为size[i]原创 2017-08-22 20:46:19 · 967 阅读 · 0 评论 -
NKOI Round 8(12.14)
NKOI Round 8 T1.呼叫机房的同学(组合数学)T2.突然点亮的故障灯(tarjan缩点+拓扑序dp+线段树优化建图)T3.灵异电梯(状压dp)T1这题神啊。首先我们可以O(n)预处理组合数(O(n)算出所有逆元,O(n)做两个前缀积)。然后我们发现可以O(n2)O(n^2) 算一个点到一个矩形内的所有点的方案数之和。就是一堆组合数加起来。然后我们发现可以一行一行的算,每一行都是Cba+原创 2017-12-15 17:19:39 · 466 阅读 · 1 评论 -
bzoj3056 升降梯口(组合数学+模拟)
可以发现每四个数一组(档一个就会转到其余3个),一共有n*n/4组,最后的答案一定是每组有一个1.那我们就可以按字典序顺序来循环每一个位置,直接算出未填的方案数,从而来决定这一位是否填1。原创 2018-01-13 21:46:54 · 389 阅读 · 0 评论 -
hdu6114 2017"百度之星"初赛(B)1001Chess(dp)
设nCmn" role="presentation" style="position: relative;">CnmCmnC_m^n。直接递推算组合数就可以了O(n2)" role="presentation" style="position: relative;">O(n2)O(n2)O(n^2)#include #define mod 1000000007#define ll long原创 2017-08-13 21:59:28 · 319 阅读 · 0 评论 -
bzoj1072 [SCOI2007]排列perm(状压dp+组合数学)
f[i][j]表示选了i状态的位置上的数,余数为j的方案数。 最后用排列组合的知识去一下重(除掉同一个数的顺序) 复杂度O(T∗2nm)O(T*2^nm)原创 2018-04-01 21:41:23 · 269 阅读 · 0 评论 -
bzoj3162 独钓寒江雪(树形dp+Hash)
就是求无根树的本质不同的独立集个数。如果不考虑本质不同,则有树形dp。 考虑本质不同,就要考虑无根树的同构,可以用hash来搞。具体题解见:portal我的hash真是冲突到死【再见】,hash值最好从大往小排。。。原创 2018-03-21 17:15:02 · 295 阅读 · 0 评论 -
bzoj1005 [HNOI2008]明明的烦恼(prufer序列+组合数学+高精)
给定一棵n个点的树的一些点的度数,问你有多少种满足要求的无根树。还是转化成prufer序列,就是求一些数的出现次数给定,有多少种不同的prufer序列。设有m个点度数未知,k个位置未填,则答案就是(n−2)!∏i=1n−m+1(d[i]−1)!k!∗mk\frac{(n-2)!}{\prod\limits_{i=1}^{n-m+1}(d[i]-1)!k!}*m^k 需要高精,我们还是先分解质因数,原创 2018-03-25 15:40:47 · 274 阅读 · 0 评论 -
bzoj1211 [HNOI2004]树的计数(prufer序列+组合数学+计数)
对于一颗n个点的无根树,我们可以得到唯一的prufer序列,长度为n-2。 每一个prufer序列也都唯一对应了一颗无根树。 每一个点x在prufer序列中的出现次数为d[x]-1,d[x]为x点的度数。此题给定每个点的度数,求一共有多少种不同的树,也就是求有多少种不同的prufer序列,满足每个数x出现了d[x]-1次。 我们应用组合数学的知识得到答案就是(n−2)!∏ni=1(d[i]−1原创 2018-03-25 14:55:36 · 259 阅读 · 0 评论 -
poj1737 Connected Graph(计数,组合数学,递推,高精)
求n个点的连通图的个数f[n],带标号。有两种做法。 1.直接搞出f[n]的递推式。 f[n]=∑k=1n−1f[k]∗f[n−k]∗Ck−1n−2∗(2k−1)f[n]=\sum\limits_{k=1}^{n-1}f[k]*f[n-k]*C_{n-2}^{k-1}*(2^k-1) 如何理解呢? 对于一张连通图,我们首先拿掉1号点,考虑此时2号点的情况,假设此时有k-1个点仍与2号点相连(原创 2018-01-14 12:44:55 · 592 阅读 · 0 评论 -
bzoj3160 万径人踪灭(manacher+fft)
要求不连续的回文子序列个数。我们考虑用所有的回文子序列个数-连续的回文子序列个数。连续的回文子序列个数就是回文子串的个数,我们可以用manacher来求。考虑如何求回文子序列的总数。我们先都按manacher那样插入若干’#’以后,处理出一个f[i]数组,表示i两侧对称的字母对数。(含自己,不含#)。则总数就是∑i=22n2f[i]−1\sum\limits_{i=2}^{2n}2^{f[i]}-1原创 2018-03-15 22:58:43 · 336 阅读 · 0 评论 -
bzoj3434 [Wc2014]时空穿梭(莫比乌斯函数+多项式乘法)
蒟蒻我第一步共线就没想出来x暴力dp T飞。直接爆零qaq 我们记C个点分别为CiC_i,V为{v1,v2...vn}\{v_1,v_2...v_n\},令Bi=Ci−Ci−1B_i=C_i-C_{i-1}。则我们发现Bi=(ti−ti−1)VB_i=(t_i-t_{i-1})V,也就是说每一个B的各维坐标都是成比例的。我们设第i维的坐标极差为Δxi\Delta x_i(Cn−C1C_n-C_1)原创 2018-01-29 17:53:02 · 481 阅读 · 0 评论