恶补大家小学就会的知识点
其实是一些乱七八糟的基础知识
容斥
n种限制,算方案数
不满足任何限制
ans=S∑(−1)∣S∣fS=i=0∑n(−1)i(in)fifS表示钦定满足S集合限制,其他任意的方案数
fi表示钦定满足i种限制,其他任意的方案数
假设有一种方案满足k>0种限制,那么它会被算这么多次:
===0(0k)−(1k)+(2k)−(3k)−...+(−1)k(kk)1−((0k−1)+(1k−1))+((1k−1)+(2k−1))−...+((k−1k−1))1−(0k−1)而只有当k=0时,才会被算(00)=1次
所以这样算就对了
至少满足一个限制
ans=i=1∑n(−1)i+1(in)fifi定义相同,证明方法同上
另外也可以通过维恩图理解
恰好满足k个限制(广义容斥原理)
设gk表示答案
gk=i=k∑n(−1)i−k(ki)fifi定义相同
证明方法只能(我只知道)通过二项式反演。
fk⇒gk=i=k∑n(ki)gi=i=k∑n(−1)i−k(ki)fi上面的式子要乘个组合数是因为要枚举出在i个限制中是哪k个满足(f在乱选的时候会算重)
至少满足k个限制(至多类似)
ans=i=k∑ngi其中gi表示恰好满足i个限制的方案,于是转化到上一个问题
多项式
一些零碎的东西
在得到一个看起来很像卷积的式子后,先把枚举的部分通过变量替换得到j=0∑i的形式
比如,本身式子长这样:j=i∑nf[j−i]g[j],就可以把j−i替换成k,变成k=0∑n−if[k]g[k+i]
然后通过翻转来凑出卷积的形式
接着上面的式子,把g数组翻转后得到k=0∑n−if[k]g[n−k−i],这样就能直接卷了,卷出来之后再翻转一下就得到要求的数组了
生成函数
就是把一个数列转化成多项式的形式,转化成更简洁的式子。通过多项式运算,计算系数,来得到答案
用生成函数能快速得到每一项的答案
有时候因为不好直接考虑很多个物品的组合,也可以通过把若干个生成函数直接相乘取[xn],以方便计算
感觉这东西往往与值域有关
泰勒展开
很好理解的视频
f(x)=n=0∑∞n!f(n)x0(x−x0)n
其中n!1是为了把xn一次一次求导后得到的系数n!消去
指数型生成函数
在取[xn]的时候前面要乘一个n!1,因为指数型生成函数会带一个i!1