数学速记
自记,略丑,勿看
(有的或许会分出去单独写一篇)
欧拉函数
$φ(i)$表示小于$i$的正整数数中与$i$互质的个数
若$p$为质数,则$φ(p)=p-1$
$\sum\limits_{d|n}φ(d)=n$(不会证)
*欧拉函数是积性函数
欧拉定理
若$a$与$p$互质,则$$a^{φ(p)}≡1(\mod p)$$
(感性)证明:
设$S=\{x|x<p,gcd(x,p)=1\}$,显然$|S|=φ(p)$,则$S=\{x_{1},x_{2},···,x_{φ(p)}\}$;
设$Z_{p}=\{a\times x_{1}\mod p,a\times x_{2}\mod p,···,a\times x_{φ(p)}\mod p\}$,
先证$S=Z_{p}$:
因为$∀x∈S$,$gcd(x,p)=1$,且$gcd(a,p)=1$
所以$gcd(a\times x_{1},p)=gcd(a\times x_{2},p)=···=gcd(a\times x_{φ(p)},p)=1$
又因为$x_{1}\neq x_{2}\neq ···\neq x_{φ(p)}$
所以$a\times x_{1}\mod p\neq a\times x_{2}\mod p\neq ···\neq a\times x_{φ(p)}\mod p$
所以$S=Z_{p}$
又因为
左边$≡a^{φ(p)}\times x_{1}\times x_{2}\times ···\times x_{φ(p)}(\mod p)$
$≡(a\times x_{1})\times(a\times x_{2})\times ···\times (a\times x_{φ(p)})(\mod p)$
$≡(a\times x_{1}mod p)\times(a\times x_{2}mod p)\times ···\times (a\times x_{φ(p)}mod p)(\mod p)$
$≡x_{1}\times x_{2}\times ···\times x_{φ(p)}(\mod p)≡$右边
左右消去$x_{1}\times x_{2}\times ···\times x_{φ(p)}$,则$a^{φ(p)}≡1(\mod p)$
证毕.
扩展欧几里得算法
欧几里得算法
求$gcd(a,b)$;
定理:$gcd(a,b)=gcd(b,a\%b)$
证明:设$c=gcd(a,b),r=a\%b,a=xc,b=yc$($x,y$互质)
则$r=a\%b=a-pb=xc-pyc=(x-py)c$
先证$y$和$(x-py)$互质:
假设$y$和$(x-py)$不互质,设$y=nk,x-py=mk$
则$a=xc=(mk+pnk)c=(m+pn)kc$
$b=yc=nkc$
显然此时$gcd(a,b)=kc$,矛盾;
所以$y$和$(x-py)$互质;
因此$gcd(b,r)=c$,即$gcd(a,b)=gcd(b,a\%b)$.
直接用式子递归,边界是$a\%b=0$时返回$b$;
(为什么不用__gcd呢)
扩展欧几里得算法
已知$a,b,c$,求不定方程$ax+by=c$的(一组)解;
显然这个方程和$ax+by=gcd(a,b)$等价(最后把解乘回去即可);
这个普遍形式又叫贝祖等式,用扩展欧几里得解;
不妨设$a>b$,借用欧几里得算法的递归形式:
设$$\begin{cases}ax_1+by_1=gcd(a,b)\\ bx_2+(a\%b)y_2=gcd(b,a\%b) \end{cases}$$
显然有$ax_1+by_1=bx_2+(a\%b)y_2$
即$ax_1+by_1=bx_2+(a-\frac{a}{b}*b)y_2$
$ax_1+by_1=ay_2+b(x_2-\frac{a}{b}*y_2)$
显然有$x_1=y_2,y_1=x_2-\frac{a}{b}*y_2$
递归下去做就好了;
边界:当$b=0$时,$gcd(a,b)=a$,原方程化为$ax=a$,解为$x=1,y=0$;
*这里也可以证出来贝祖等式必定有解,即裴蜀定理
扩欧求逆元
要求$ax≡1(\mod p)$;
把式子变成$ax-py=1$去做就好了,最后检查是否为逆元,不是则说明没有,返回答案时把答案调整到$0到p-1$之间即可;
贴个求逆元板子(听说这是NOIP原题):
1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<cmath>
5 using namespace std;
6 typedef long long ll;
7 ll a,b;
8 ll exgcd(ll a,ll b,ll &d,ll &x,ll &y){
9 if(!b){
10 d=a;
11 x=1;
12 y=0;
13 }else{
14 exgcd(b,a%b,d,y,x);
15 y-=x*(a/b);
16 }
17 }
18 ll getinv(int a,int p){
19 ll d,x,y;
20 exgcd(a,p,d,x,y);
21 return (x+p)%p;
22 }
23 int main(){
24 scanf("%lld%lld",&a,&b);
25 printf("%lld",getinv(a,b));
26 return 0;
27 }
费马小定理
若$p$为质数且$gcd(a,p)=1$,则$$a^{p-1}≡1(\mod p)$$
因为$p$是质数,所以$\varphi(p)=p-1$,
所以$a^{φ(p)}=a^{p-1}≡1(\mod p)$
BSGS&exBSGS
离散对数问题:给定$a,b,p$,求最小的$x$使得$a^x≡b(\mod p)$
BSGS:p为质数(gcd(a,p)=1)
设$m=\lceil\sqrt{p}\rceil$,$x=im-j$
$$a^{im-j}≡b(\mod p)$$
$$a^{im}≡b\times a^j(\mod p)$$
从$0$到$m$枚举$j$将$b\times a^j$加入哈希表,再从$1$到$m$枚举$i$找到最小的$im$使得$a^{im}≡b\times a^j(\mod p)$
此时$x=im-j$即为答案;
证明:$x$不大于$p$;
要证:
$$a^{x \mod p-1}≡a^x(\mod p)$$
变式得:
$$a^{x-t(p-1)}≡a^x(\mod p)$$
$$\frac{a^x}{a^{t(p-1)}}≡a^x(\mod p)$$
由费马小定理可知当p为质数且$gcd(a,p)=1$时$a^{p-1}≡1(\mod p)$
上式得证;
因此$x$不会大于$p$,枚举$i$,$j$到$m$即可,由于$m=\lceil\sqrt{p}\rceil$,所以总时间复杂度是$O(\sqrt{p})$的。
模板:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
ll a,b,c;
map<ll,ll>m;
ll ksm(ll x,ll y,ll p){
ll ret=1;
for(;y;y>>=1,x=x*x%p){
if(y&1)ret=ret*x%p;
}
return ret;
}
ll BSGS(ll a,ll b,ll c){
a%=c;
if(!a&&!b)return 1;
if(!a)return -1;
m.clear();
ll k=ceil(sqrt(c)),t=1,s=ksm(a,c-k-1,c),inv=1;
m[1]=k+1;
for(int i=1;i<k;i++){
t=t*a%c;
if(!m[t])m[t]=i;
}
for(int i=0;i<k;i++){
int ss=m[b*inv%c];
if(ss){
if(ss==k+1)ss=0;
return i*k+ss;
}
inv=inv*s%c;
}
return -1;
}
int main(){
while(scanf("%lld%lld%lld",&a,&b,&c)!=EOF){
ll ans;
if((ans=BSGS(b,c,a))==-1)printf("no solution\n");
else printf("%lld\n",ans);
}
return 0;
}
exBSGS:p不为质数(gcd(a,p)≠1)
令$d=gcd(a,p)$,如果$d$不能整除$d$则无解,否则等式两边同除$d$直至$gcd(a,p)=1$;
设$r$次后$gcd(a,p)=1$,则最后把答案加上$r$即可;
注意答案可能会小于$r$,因此对于$r$以内的情况直接暴力判断,显然$r\leq logp$,所以时间复杂度是对的;
模板:
咕
Lucas定理
求$$\binom{n}{m} \mod p$$
其中$n$,$m$很大,而$p$很小,传统的阶乘求法会T,于是需要lucas定理:$$\binom{n}{m}≡\binom{n\% p}{m\% p}\times\binom{n/p}{m/p} \mod p$$
形式化地,把$a$,$b$写成$p$进制(把短的向长的补齐):$$n=(a_{0}a_{1}···a_{k})_{p},m=(b_{0}b_{1}···b_{k})_{p}$$
那么$$\binom{n}{m}≡\prod_{i=0}^{k}\binom{a_{i}}{b_{i}}\mod p$$
证明:
把定理变式,设$n=ap+b,m=cp+d(b,d<p,a=\lfloor\frac{n}{p}\rfloor,c=\lfloor\frac{m}{p}\rfloor)$,那么:$$\binom{n}{m}≡\binom{a}{b}\times\binom{c}{d} \mod p$$
先证对于任意质数$p$有:
$$(1+x)^p≡1+x^p(\mod p)$$
由费马小定理得$$(1+x)^{p-1}≡1(\mod p)$$
所以$$(1+x)^{p-1}≡1+x≡1+x^p(\mod p)$$
那么(以下运算均在$\mod p$意义下):
$$(1+x)^n≡(1+x)^{\lfloor \frac{n}{p}\rfloor\times p}(1+x)^b$$
$$≡(1+x^p)^{\lfloor \frac{n}{p}\rfloor}(1+x)^b$$
$$≡\sum\limits_{i=0}^{\lfloor \frac{n}{p}\rfloor}\binom{\lfloor \frac{n}{p}\rfloor}{i}x^{pi}\sum\limits_{j=0}^{b}\binom{b}{j}x^j$$
把式子左右两边$x^m$的系数提出来:
$$左边=\binom{n}{m}$$
$$右边=\binom{\lfloor\frac{n}{p}\rfloor}{i}\binom{b}{j},其中pi+j=m,j<p$$
$$=\binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{m}{p}\rfloor}\binom{b}{d}$$
$$=\binom{a}{b}\binom{c}{d}$$
证毕.
实际题目中$p$比较小的话可以线性预处理阶乘和逆元。
CRT&扩展CRT
老祖宗的智慧(大雾)
求解同余方程组:
$$\begin{cases}x≡a_1(\mod p_1) \\x≡a_2(\mod p_2) \\x≡a_3(\mod p_3) \\ \cdots \\x≡a_k(\mod p_k)\end{cases}$$
CRT:$p_1,p_2,...,p_k$两两互质
设$P=\prod\limits_{i=1}^{k}p_i$,$t_i$为同余方程$\frac{P}{p_i}t_i≡1(\mod p_i)$的最小非负整数解;
则方程组有一解为:
$$x=\sum_{i=1}^{k}a_it_i\frac{P}{p_i}$$
通解为:
$$x+i\times P(i∈Z)$$
显然最小非负整数解为$(x\%P+P)\%P$
证明:
∵$\frac{P}{p_i}$是除了$p_i$以外所有$p$的倍数
∴$∀j≠i,a_it_i\frac{P}{p_i}≡0(\mod p_j)$
又∵$\frac{P}{p_i}t_i≡1(\mod p_i)$
∴$a_it_i\frac{P}{p_i}≡a_i(\mod p_i)$
代入$x=\sum\limits_{i=1}^{k}a_it_i\frac{P}{p_i}$显然原方程组成立;
求$t_i$的过程可以用exgcd实现.
模板:
咕
扩展CRT:$p_1,p_2,...,p_k$不一定两两互质
这时可以把方程两两合并,最后的解就是整个方程组的解;
设有两个同余方程:
$$\begin{cases}x≡a_1(\mod p_1) \\x≡a_2(\mod p_2)\end{cases}$$
把mod去掉就是:
$$\begin{cases}x=p_1x_1+a_1 \\x=p_2x_2+a_2\end{cases}$$
即:
$$p_1x_1+a_1=p_2x_2+a_2$$
$$p_1x_1-p_2x_2=a_2-a_1$$
显然这是个二元一次不定方程的形式,直接扩欧解决;
设求出了一个最小整数解$x_1$,令$y=p_1x_1+a_1$,则有:
$$x≡y(\mod lcm(p_1,p_2))$$
总共进行$k$次扩欧即可;
模板:
1 #include<algorithm>
2 #include<iostream>
3 #include<cstring>
4 #include<cstdio>
5 #include<cmath>
6 #include<queue>
7 #define inf 2147483647
8 #define eps 1e-9
9 using namespace std;
10 typedef long long ll;
11 typedef double db;
12 int n;
13 ll a,b,bb,c,x,y,k,M,tmp,ans,A[100001],B[100001];
14 ll fastmul(ll a,ll b,ll p){
15 return (a*b-(ll)((long double)a/p*b)*p+p)%p;
16 }
17 ll exgcd(ll a,ll b,ll &x,ll &y){
18 if(!b){
19 x=1;
20 y=0;
21 return a;
22 }
23 ll tmp=exgcd(b,a%b,x,y),t=x;
24 x=y;
25 y=t-a/b*y;
26 return tmp;
27 }
28 int main(){
29 scanf("%d",&n);
30 for(int i=1;i<=n;i++){
31 scanf("%lld%lld",&B[i],&A[i]);
32 }
33 M=B[1];
34 ans=A[1];
35 for(int i=2;i<=n;i++){
36 a=M;
37 b=B[i];
38 c=(A[i]-ans%b+b)%b;
39 tmp=exgcd(a,b,x,y);
40 bb=b/tmp;
41 if(c%tmp)return puts("-1"),0;
42 x=fastmul(x,c/tmp,bb);
43 ans+=x*M;
44 M*=bb;
45 ans=(ans%M+M)%M;
46 }
47 printf("%lld",(ans%M+M)%M);
48 return 0;
49 }
杜教筛
第一次听说可以用小于$O(n)$的时间复杂度求积性函数前缀和的时候我是震惊的……
前置知识:莫比乌斯反演
求积性函数$f(i)$的前缀和$S(n)=\sum\limits_{i=1}^{n}f(i)$;
套路式:构造$g,h$使得$h=f*g$(狄利克雷卷积)
$$\sum_{i=1}^{n}h(i)=\sum_{i=1}^{n}\sum_{d|i}g(d)f(\frac{i}{d})$$
$$=\sum_{d=1}^{n}g(d)\sum_{i}^{\lfloor\frac{n}{d}\rfloor}f(i)$$
$$=\sum_{d=1}^{n}g(d)S(\lfloor\frac{n}{d}\rfloor)$$
这一步超帅!!!
$$\sum_{i=1}^{n}h(i)=g(1)S(n)+\sum_{d=2}^{n}g(d)S(\lfloor\frac{n}{d}\rfloor)$$
$$g(1)S(n)=\sum_{i=1}^{n}h(i)-\sum_{d=2}^{n}g(d)S(\lfloor\frac{n}{d}\rfloor)$$
显然可以构造一个很好求前缀和的$h(i)$,再对后半部分数论分块+记忆化搜索;
当线性筛预处理到$n^{\frac{2}{3}}$时时间复杂度达到最优:$O(n^{\frac{2}{3}})$
常见的积性函数:
$$\sum_{i=1}^{n}\mu(i)=1-\sum_{d=2}^{n}S(\lfloor\frac{n}{d}\rfloor)$$
原理是$\mu*I=\epsilon$
$$\sum_{i=1}^{n}\varphi(i)=\frac{n*(n+1)}{2}-\sum_{d=2}^{n}S(\lfloor\frac{n}{d}\rfloor)$$
遇到不熟的积性函数就按照性质配吧……貌似没有什么通配的方法
洲阁筛&min_25筛
伯努利数&自然数幂求和
$$B_0=1$$
$$\sum\limits_{k=1}^{n}\binom{n+1}{k}B_k=0$$
递推式:
$$B_n=-\frac{1}{n+1}\sum_{i=0}^{n-1}\binom{n+1}{i}B_i$$
关于自然数幂求和:
$$\sum_{i=1}^{n}i^k=\frac{1}{k+1}\sum_{i=1}^{k+1}\binom{k+1}{i}B_{k-i+1}(n+1)^i$$
合起来就可以$O(n+k^2)$预处理
证明怎么可能会呢……
牛顿迭代法
解实数方程
解多项式方程
矩阵&行列式
矩阵树定理
生成函数
普通生成函数
一个数列$\langle a_0,a_1,a_2,\cdots\rangle$的生成函数可以被表示为一个辅助变量$z$的(形式)幂级数:
$$A(z)=\sum_{k=0}^{\infty}a_kz^k$$
显然:
$$[z^n]A(z)=a_n$$
多项式的卷积就是生成函数的乘积:
$$c_n=\sum_{k=0}^{n}a_kb_{n-k}$$
$$c_n=[z^n]A(z)B(z)$$
做题的时候把多项式变成生成函数的形式更容易看出fft/ntt优化
*二项式定理&范德蒙德卷积
序列$\langle\binom{r}{0},\binom{r}{1},\binom{r}{2},\cdots\rangle$的生成函数是$(1+z)^r$(二项式定理)
即:
$$(1+z)^r=\sum_{k\geq 0}\binom{r}{k}z^k$$
两个自乘即可得到范德蒙德卷积:
$$\sum_{k=0}^{n}\binom{r}{k}\binom{s}{n-k}=\binom{r+s}{n}$$
*五边形数和整数拆分问题
咕
指数生成函数
序列$\langle g_n\rangle$的指数生成函数(egf)是幂级数:
$$\hat{G}(z)=\sum_{k=0}^{\infty}g_k\frac{z^k}{k!}$$
为什么叫指数生成函数?因为:
$$e^x=\sum_{n=0}^{\infty}\frac{x^n}{n!}$$
即$e^x$是数列$\langle1,1,1,\cdots\rangle$的egf.
一类图论计数问题
【BZOJ3456】城市规划
【XSY3368】青春野狼不做小恶魔学妹的梦
prufer序列
莫比乌斯反演
斯特林数
第一类
$\begin{bmatrix}n\\m\end{bmatrix}$(也可以表示为$s(n,m)$)表示把$n$个元素划分成$m$个轮换的方案数;
递推式:
$$\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\m\end{bmatrix}$$
第二类
$\begin{Bmatrix}n\\m\end{Bmatrix}$(也可以表示为$S(n,m)$)表示把$n$个元素划分成$m$个非空子集的方案数;
递推式:
$$\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m\begin{Bmatrix}n-1\\m\end{Bmatrix}$$
通项公式:
$$\begin{Bmatrix}n\\m\end{Bmatrix}=\frac{1}{m!}\sum_{k=0}^{m}(-1)^k\binom{m}{k}(m-k)^n$$
组合意义:枚举子集个数,其他随便放,由于子集视作相同的所以最后除以$m!$
把上式拆掉组合数可得:
$$\begin{Bmatrix}n\\m\end{Bmatrix}=\sum_{k=0}^{m}(-1)^k\times\frac{1}{k!}\times\frac{(m-k)^n}{(m-k)!}$$
可以发现这是个卷积的形式,用ntt优化可以在$O(nlogn)$的时间内求出$S(n,0),S(n,1),......$
贴个模板:【BZOJ4555】【TJOI2016】【HEOI2016】求和
1 #include<algorithm>
2 #include<iostream>
3 #include<cstring>
4 #include<cstdio>
5 #include<cmath>
6 #define mod 998244353
7 #define g 3
8 using namespace std;
9 typedef long long ll;
10 int n,bit=1,bitnum=0,rev[500001];
11 ll fac[500001],pw[500001],inv[500001],pre[500001],a[500001],b[500001],ans;
12 ll fastpow(ll x,ll y){
13 int ans=1;
14 for(;y;y>>=1,x=x*x%mod){
15 if(y&1)ans=ans*x%mod;
16 }
17 return ans;
18 }
19 void _(){
20 fac[0]=pw[0]=inv[1]=pre[0]=a[0]=b[0]=1;
21 for(int i=2;i<=bit;i++){
22 inv[i]=(mod-mod/i)*inv[mod%i]%mod;
23 }
24 for(int i=1;i<=n;i++){
25 fac[i]=fac[i-1]*i%mod;
26 pw[i]=pw[i-1]*2%mod;
27 pre[i]=pre[i-1]*inv[i]%mod;
28 }
29 for(int i=1,f=-1;i<=n;i++,f=-f){
30 b[i]=pre[i]*f%mod;
31 a[i]=(i==1)?(n+1):(pre[i]*(fastpow(i,n+1)-1)%mod*inv[i-1]%mod);
32 }
33 }
34 void ntt(ll *s,int op){
35 for(int i=0;i<bit;i++)if(i<rev[i])swap(s[i],s[rev[i]]);
36 for(int i=1;i<bit;i<<=1){
37 ll w=fastpow(g,(mod-1)/(i<<1));
38 for(int p=i<<1,j=0;j<bit;j+=p){
39 ll wk=1;
40 for(int k=j;k<i+j;k++,wk=1LL*wk*w%mod){
41 ll x=s[k],y=1LL*s[k+i]*wk%mod;
42 s[k]=(x+y)%mod;
43 s[k+i]=(x-y+mod)%mod;
44 }
45 }
46 }
47 if(op==-1){
48 reverse(s+1,s+bit);
49 //int inv=fastpow(bit,mod-2);
50 //for(int i=0;i<bit;i++)a[i]=1LL*a[i]*inv%mod;
51 }
52 }
53 int main(){
54 scanf("%d",&n);
55 for(;bit<=n*2;bit<<=1)bitnum++;
56 for(int i=0;i<bit;i++){
57 rev[i]=(rev[i>>1]>>1)|((i&1)<<(bitnum-1));
58 }
59 _();
60 ntt(a,1);
61 ntt(b,1);
62 for(int i=0;i<=bit;i++){
63 a[i]=a[i]*b[i]%mod;
64 }
65 ntt(a,-1);
66 for(int i=0;i<=n;i++){
67 ll tmp=fac[i]*pw[i]%mod*a[i]%mod*inv[bit]%mod;
68 ans=(ans+tmp)%mod;
69 }
70 printf("%lld",(ans+mod)%mod);
71 return 0;
72 }
关于自然数幂:
$$n^k=\sum_{i=0}^{k}\begin{Bmatrix}k\\i\end{Bmatrix}\binom{n}{i}i!$$
组合意义左边求$k$个球放在$n$个盒子里的方案数,右边先枚举非空盒子数,再从中选出$i$个盒子,把$k$个球放在这$i$个盒子里;
也可以写成:
$$n^k=\sum_{i=0}^{k}\begin{Bmatrix}k\\i\end{Bmatrix}n^{\underline{i}}$$
斯特林反演
若函数$f,g$满足:
$$f(n)=\sum_{i=1}^{n}\begin{Bmatrix}n\\i\end{Bmatrix}g(i)$$
则:
$$g(n)=\sum_{i=1}^{n}(-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix}f(i)$$
证明咕咕咕,详见这篇博客
主要推容斥系数的时候会用吧。。。
二项式反演
设两个函数$f,g$满足:
$$g(i)=\sum_{j=1}^{i}\binom{i}{j}f(j)$$
则:
$$f(i)=\sum_{j=1}^{i}(-1)^{i-j}\binom{i}{j}g(j)$$
另一种形式,若有:
$$g(i)=\sum_{j=1}^{i}(-1)^j\binom{i}{j}f(j)$$
则:
$$f(i)=\sum_{j=1}^{i}(-1)^j\binom{i}{j}f(j)$$
证明(第一种形式):
把$g$的定义代入可得:
$$f(i)=\sum_{j=1}^{i}(-1)^{i-j}\binom{i}{j}\sum_{k=1}^{j}\binom{j}{k}f(k)$$
考虑$f(k)$在每次求和时的贡献,$f(k)$的系数就是:
$$\sum_{j=k}^{i}(-1)^{i-j}\binom{i}{j}\binom{j}{k}$$
那么要证的就是上式当且仅当$i=k$时值为1,否则均为0;
把组合数拆掉,大力化式子:
$$原式=\sum_{j=k}^{i}(-1)^{i-j}\frac{i!}{(i-j)!(j-k)!k!}$$
$$=\left(\sum_{j=k}^{i}(-1)^{i-j}\frac{1}{(i-j)!(j-k)!}\right)\times\frac{i!}{k!}$$
$$=\left(\sum_{j=k}^{i}(-1)^{i-j}\frac{(i-k)!}{(i-j)!(j-k)!}\right)\times\frac{i!}{k!(i-k)!}$$
$$=\left(\sum_{j=k}^{i}(-1)^{i-j}\binom{i-k}{j-k}\right)\times\binom{i}{k}$$
显然左边的式子相当于$i-k$的二项式系数错位相减,根据二项式定理可以全部消掉,即当$i\neq k$时,左式为0;当$i=k$时,易得左右均为1,因此二项式反演得证。
min_max容斥
最值反演
设$S$是一个集合,$min(S)$和$max(S)$分别表示其中的最大值和最小值,则有:
$$\max(S)=\sum_{T\subseteq S}(-1)^{|T|+1}\min(T)$$
$$\min(S)=\sum_{T\subseteq S}(-1)^{|T|+1}\max(T)$$
最值反演在期望情况下也成立:
$$\mathbb{E}[\max(S)]=\sum_{T\subseteq S}(-1)^{|T|+1}\mathbb{E}[\min(T)]$$
证明从容斥的角度入手,首先当且仅当$T={\max(S)}$时$\min(T)=\max(S)$,对于其余的所有$T$,至少存在一个集合中的数$x$使得$\min(T\cup\{x\})=\min(T)$,设对于其中一个集合有$k$个这样的$x$,显然从中选出奇数个或偶数个的方案数是相等的,所以全部都会被抵消掉,最终累加的答案只剩$\max(T)$。
k大值反演
就是上面那个东西的扩展形式……
要求$kth\max(S)$,试构造函数$f$满足:
$$kth\max(S)=\sum_{T\subseteq S}f(|T|)\min(T)$$
考虑集合$S$中第$i$大的元素,若$\min(T)=i$,则$T$中只会出现大于$i$的元素,这样的元素共$i-1$个,所以$i$的贡献就是:
$$\sum_{j=0}^{i-1}\binom{i-1}{j}f(j+1)$$
那么构造出的$f$就需要满足:
$$\sum_{j=0}^{i-1}\binom{i-1}{j}f(j+1)=[i==k]$$
等价于:
$$\sum_{j=0}^{i}\binom{i}{j}f(j+1)=[i==k-1]$$
设$g(i)=[i==k-1]$,容易发现这是个二项式反演的形式(有0是一样的),那么:
$$f(i+1)=\sum_{j=0}^{i}(-1)^{i-j}\binom{i}{j}g(j)$$
注意这里是$f(i+1)$是因为前面枚举的是$f(j+1)$,反演回来同样要加回1;
根据$g$的定义可得当且仅当$j=k-1$时右边的值才不为零,所以其他项全部都没有意义,即:
$$f(i+1)=(-1)^{i-k+1}\binom{i}{k-1}$$
$$f(i)=(-1)^{i-k}\binom{i-1}{k-1}$$
这就是我们要求的$f$,代回最初的式子:
$$kth\max(S)=\sum_{T\subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min(T)$$
要求第$k$大的话只考虑大小大于$k$的子集即可。
子集和反演&子集卷积
单位根反演
拉格朗日反演
一些定义
对于任意域$F$定义其上的形式幂级数为
$$f(x)=\sum_{i=0}^{\infty}a_ix^i$$
记所有的形式幂级数为$F[[x]]$(一般oi里常用的域是复数域或者模$P$意义下的域)
$F[[x]]$构成整环,记其商域为$F((x))$,则$F((x))$是一个分式环,由形如
$$f(x)=\sum_{i=-k}^{\infty}a_ix^i$$
的元素构成.
若有两个幂级数$f(x),g(x)$且均满足常数项为0,一次项非0且
$$f(g(x))=x$$
则$f(x)$和$g(x)$互为复合逆;
这里有一个结论:无常数项的幂级数在复合运算下构成群;
因此$f(g(x))=x$等价于$g(f(x))=x$.
拉格朗日反演
设幂级数$f(x),g(x)$互为复合逆,$g(f(x))=x$
则有:
$$[x^n]f(x)=\frac{1}{n}[x^{-1}]\frac{1}{g(x)^n}$$
用形式幂级数表示的一个更简便的形式(一般会用到的)是:
$$[x^n]f(x)=\frac{1}{n}[x^{n-1}]\frac{1}{g'(x)^n}$$
其中$g'(x)$不是$g(x)$的导数,而是$g(x)$去掉常数项后剩下的常数项非零的幂级数,即$g'(x)=\frac{g(x)}{x}$
要求$f(x)$的任一项系数,就只需要在$\mod x^n$意义下进行多项式求幂和求逆即可;
注意由于$f,g$互为复合逆,所以上面式子里所有的$f,g$都可以互换.
证明
(其实并不是很会,只是抄了下来而已)
首先有
$$f(g(x))=x$$
记$f(x)=\sum\limits_{i=1}^{\infty}a_ix^i$
则
$$f(g(x))=\sum_{i=1}^{\infty}a_ig^i(x)=x$$
对等式两边求导得
$$\sum_{i=1}^{\infty}ia_ig^{i-1}(x)g'(x)=1$$
两侧除以$g^n(x)$,再取$x^{-1}$的系数得
$$[x^{-1}]\sum_{i=1}^{\infty}ia_ig^{i-n-1}(x)g'(x)=[x^{-1}]\frac{1}{g^n(x)}~~~(1)$$
当$i\neq n$的时候,有
$$g^{i-n-1}(x)g'(x)=\frac{1}{i-n}(g^{i-n})'(x)$$
而分式环$F((x))$中的任意一个函数求导之后-1次项均为0,所以$(1)$式中左边$i\neq n$的项均为0,所以
$$[x^{-1}]na_n\frac{g'(x)}{g(x)}=[x^{-1}]\frac{1}{g^n(x)}$$
把$\frac{g'(x)}{g(x)}$展开:
$$\frac{g'(x)}{g(x)}=\frac{\sum\limits_{i=1}^{\infty}is_ix^{i-1}}{\sum\limits_{i=1}^{\infty}s_ix^i}$$
$$=\frac{\sum\limits_{i=1}^{\infty}is_ix^{i-1}}{s_1x}\times\frac{1}{1+\sum\limits_{i=1}^{\infty}\frac{s_{i+1}}{s_1}x^i}$$
$$=\left(x^{-1}+\sum_{i=0}^{\infty}s_{i+2}x^i\right)\left(1-z\left(\sum_{i=0}^{\infty}\frac{s_{i+2}}{s_1}x^i\right)\right)$$
所以
$$[x^{-1}]\frac{g'(x)}{g(x)}=1$$
代回去即可得到
$$a_n=\frac{1}{n}[x^{-1}]\frac{1}{g^n(x)}$$
证毕.
扩展拉格朗日反演
听说这东西还能扩展
设$f(x),g(x)$互为复合逆,则
$$[x^n]h(f(x))=\frac{1}{n}[x^{n-1}]h'(x)(\frac{x}{g(x)})^n$$
其中$h'(x)$表示$h(x)$的导数.