數學速記

自記,略醜,勿看html

(有的或許會分出去單獨寫一篇)ios

歐拉函數

$φ(i)$表示小於$i$的正整數數中與$i$互質的個數算法

若$p$爲質數,則$φ(p)=p-1$ide

$\sum\limits_{d|n}φ(d)=n$(不會證)函數

*歐拉函數是積性函數優化

歐拉定理

若$a$與$p$互質,則$$a^{φ(p)}≡1(\mod p)$$spa

(感性)證實:code

設$S=\{x|x<p,gcd(x,p)=1\}$,顯然$|S|=φ(p)$,則$S=\{x_{1},x_{2},···,x_{φ(p)}\}$;htm

設$Z_{p}=\{a\times x_{1}\mod p,a\times x_{2}\mod p,···,a\times x_{φ(p)}\mod p\}$,blog

先證$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)$的導數.

羣論基礎

置換羣

Polya定理&Burnside引理

簡單微積分

求導&積分

不定積分

微分方程

相關文章
相關標籤/搜索