双射
单射 :不存在A中有两个元素 和 B 中同一个元素对应
满射 :B中每一个元素都在A中有对应的元素
单射 + 满射 = 双射
双射一定满足∣A∣ = ∣B∣|A|\!=\!|B|∣A∣=∣B∣
Lucas定理
LucasLucasLucas定理是用来求c(n,m)mod pc(n,m) mod\,pc(n,m)modp的值.(((p是素数)))
表达式如下:
C(n,m)%p=C(n/p,m/p)∗C(n%p,m%p)%pC(n,m)\%p=C(n/p,m/p)*C(n\%p,m\%p)\%pC(n,m)%p=C(n/p,m/p)∗C(n%p,m%p)%p
可递归实现,时间复杂度:O(plogp(n))O(plog_p(n))O(plogp(n)),大致可认为是O(plogn)O(plogn)O(plogn)
容斥的扩展公式
有集合 S1...SnS_1... S_nS1...Sn 求 ⋃i=1nSi\bigcup_{i=1}^nS_i⋃i=1nSi
⋃i=1nSi =∑T∈S∣⋂i∈TSi∣∗(−1)∣T∣−1\bigcup_{i=1}^nS_i \!= \sum_{T\in S}|\bigcap_{i\in T}S_i|*(-1)^{|T|-1}⋃i=1nSi=∑T∈S∣⋂i∈TSi∣∗(−1)∣T∣−1
小练习
nnn个整数变量xix_ixi满足0 ≤ xi ≤ ci0\!\leq\!x_i\!\leq\! c_i0≤xi≤ci
求xxx的和等于mmm的方案数
n∗m ≤ 106n*m\!\leq\!10^6n∗m≤106
n ≤ 20,m ≤ 109n\!\leq\!20,m\!\leq\!10^9n≤20,m≤109
Min_Max容斥
有时maxmaxmax的期望非常不好算,但是minminmin的期望很好算,那么就可以把求maxmaxmax的期望转化成求minminmin的期望
max(a,b)=a+b−min(a,b)max(a,b)=a+b-min(a,b)max(a,b)=a+b−min(a,b)
max(S)=∑r⊆S(−1)∣T∣−1min(T)max(S)=\sum_{r\subseteq S}(-1)^{|T|-1}min(T)max(S)=∑r⊆S(−1)∣T∣−1min(T)
同样的 E(max(S))=E(∑r⊆S(−1)∣T∣−1min(T))E(max(S))=E(\sum_{r\subseteq S}(-1)^{|T|-1}min(T))E(max(S))=E(∑r⊆S(−1)∣T∣−1min(T))
小练习
有nnn种卡片,每一秒都有pip_ipi的概率获得第i种卡片,求每张卡片都至少有一张的期望时间
n≤20n\leq20n≤20
第一类斯特林数
s(n,k)s(n,k)s(n,k)表示把nnn个数的排列中有kkk个环的方案数
递推
考虑第nnn个数放在了哪里
1.1.1.自己成为一个环,方案为s(n−1,k−1)s(n−1,k−1)s(n−1,k−1)
2.2.2.插入之前的环中,那么一共有n−1n-1n−1的位置,所以方案为s(n−1,k) ⋅ ks(n−1,k)\!\cdot\!ks(n−1,k)⋅k
综上
s(n,k) = s(n−1,k−1) + (n−1) ⋅ s(n−1,k)s(n,k)\!=\!s(n-1,k-1)\!+\!(n-1)\!\cdot\! s(n-1,k)s(n,k)=s(n−1,k−1)+(n−1)⋅s(n−1,k)
小练习
求nnn个人分配到kkk个圆桌上,圆桌旋转相等的方案数,即只关心每个人左边的人是谁
n,k ≤ 1000n,k\!\leq\!1000n,k≤1000
s(n,k)=∑i=0ns(n−i,k−1)⋅(n−1)!(n−i)!1(n−1)!⋅s(n,k)=∑i=0ns(n−i,k−1)⋅1(n−i)!
s(n,k)=\sum_{i=0}^ns(n-i,k-1)\cdot\frac{(n-1)!}{(n-i)!}\\
\frac{1}{(n-1)!}\cdot s(n,k)=\sum_{i=0}^n s(n-i,k-1)\cdot\frac{1}{(n-i)!}
s(n,k)=i=0∑ns(n−i,k−1)⋅(n−i)!(n−1)!(n−1)!1⋅s(n,k)=i=0∑ns(n−i,k−1)⋅(n−i)!1
使f(n,k)=∑i=0ns(i,k)i!那么1(n−1)!s(n,k) = f(n−1,k−1)更新f(n,k) = f(n−1,k)+s(n,k)n!
使f(n,k)=\sum_{i=0}^n\frac{s(i,k)}{i!}\\
那么\frac{1}{(n-1)!}s(n,k)\!=\!f(n-1,k-1)\\
更新f(n,k)\!=\!f(n-1,k)+\frac{s(n,k)}{n!}
使f(n,k)=i=0∑ni!s(i,k)那么(n−1)!1s(n,k)=f(n−1,k−1)更新f(n,k)=f(n−1,k)+n!s(n,k)
第二类斯特林数
设S(n,m)S(n,m)S(n,m)表示把nnn个不同的球放到mmm个相同的盒子里,且不允许盒子为空的方案数
称SSS为第二类斯特灵数
递推:
考虑第nnn个球放到了哪里
1.1.1.自己占一个盒子,方案为S(n−1,m−1)S(n−1,m−1)S(n−1,m−1)
2.2.2.和之前的元素共占mmm个盒子,方案为S(n−1,m) ⋅ mS(n−1,m)\!\cdot\!mS(n−1,m)⋅m,最后的系数是考虑放在不同位置。
这里我们认为{1}{24}{3}\{1\}\{2 4\}\{3\}{1}{24}{3}与{1}{2}{34}\{1\}\{2\}\{3 4\}{1}{2}{34}是不同的方案
而{1}{24}{3}\{1\}\{2 4\}\{3\}{1}{24}{3}与{1}{3}{24}\{1\}\{3\}\{2 4\}{1}{3}{24}是相同的方案
综上
S(n,m) = S(n−1,m−1) + S(n−1,m) ⋅ mS(n,m)\!=\!S(n−1,m−1)\!+\!S(n−1,m)\!\cdot\!mS(n,m)=S(n−1,m−1)+S(n−1,m)⋅m
边界条件S(0,0) = 1边界条件S(0,0)\!=\!1边界条件S(0,0)=1
容斥
S(n,m)=1m!∑k=0m(−1)k⋅C(m,k)⋅(m−k)nS(n,m)=\frac{1}{m!}\sum^m_{k=0}(−1)^k\cdot C(m,k)\cdot(m−k)^nS(n,m)=m!1∑k=0m(−1)k⋅C(m,k)⋅(m−k)n
也比较好理解,我们去枚举一个空盒子的个数
答案 = 无视空盒子放的方案 - 至少有一个盒子为空的方案 + 至少有两个盒子为空的方案 + …
这个式子可以用FFTFFTFFT优化,因此我们可以在O(nlogn)O(nlogn)O(nlogn)的复杂度内得到一行的斯特林数
小练习
BellNumbersBell NumbersBellNumbers - CF568BCF568BCF568B
求nnn个数分成若干个集合的方案数
B(n)=∑i=1nS(n,i)B(n)=\sum_{i=1}^{n}S(n,i)B(n)=∑i=1nS(n,i)
欧拉数
nnn个数的排列字其中有kkk个数满足pi<pi+1p_i<p_{i+1}pi<pi+1的排列个数
递推求解
E(n,k)=(k+1) ⋅ E(n−1,k) + (n−k) ⋅ E(n−1,k−1)E(n,k)=(k+1)\!\cdot\!E(n-1,k)\!+\!(n-k)\!\cdot\!E(n-1,k-1)E(n,k)=(k+1)⋅E(n−1,k)+(n−k)⋅E(n−1,k−1)
数位dp
数位dpdpdp是计数类dpdpdp的一种,其基本问题为求一段区间内满足特定限制的数的个数。
其思路是在数位上进行dpdpdp,通常在十进制或二进制上进行。
在dpdpdp时可能需要记录:当前在第几位,上一个数字是什么,和题目有关的一些信息,当前位是否和限制相等等。
注意:
如果是多个整数,可能需要记录进位,借位等
注意前导零的问题(((这玩意细节很多)))
小练习
1.1.1.给定一个区间[l,r][l,r][l,r],问lll到rrr的整数中有几个转换成二进制数后000比111多(((不计前导零))) (POJ3252)(POJ3252)(POJ3252)
1 ≤ l < r ≤ 2 ⋅ 1091\!\leq\!l\!<\!r\!\leq\!2\!\cdot\!10^91≤l<r≤2⋅109
2.2.2.求lll到rrr之间且能被它的十进制表示的每个数字整除的数的个数。
如242424是满足条件的,因为242424是222和444的倍数。(CF55D)((CF 55D)((CF55D)(时限:4s4s4s)))
1 ≤ l < r ≤ 9 ⋅ 10181\!\leq\!l\!<\!r\!\leq\!9\!\cdot\!10^{18}1≤l<r≤9⋅1018
提示:2520 = lcm(1,2,3...9)2520\!=\!lcm(1,2,3...9)2520=lcm(1,2,3...9),所以根据一个数对252025202520取模后的值可以判断这个数是否整除1...91...91...9中的数
3.3.3.有一个物品重量为www,现在你有1,2,4,...,2n1,2,4,...,2^n1,2,4,...,2n重量的砝码各一个,问有多少种方法可以使天平平衡,www以二进制给出。(POJ3971)(POJ3971)(POJ3971)
n ≤ 1000000,w ≤ 2nn\!\leq\!1000000,w\!\leq\!2^nn≤1000000,w≤2n
思考后,题意就是让我们找一个xxx和yyy,使得w + x = y,x&y = 0w\!+\!x\!=\!y,x\&y\!=\!0w+x=y,x&y=0