• 数学速记


    自记,略丑,勿看

    (有的或许会分出去单独写一篇)

    欧拉函数

    $φ(i)$表示小于$i$的正整数数中与$i$互质的个数

    若$p$为质数,则$φ(p)=p-1$

    $sumlimits_{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 imes x_{1}mod p,a imes x_{2}mod p,···,a imes x_{φ(p)}mod p}$,

    先证$S=Z_{p}$:

    因为$∀x∈S$,$gcd(x,p)=1$,且$gcd(a,p)=1$

    所以$gcd(a imes x_{1},p)=gcd(a imes x_{2},p)=···=gcd(a imes x_{φ(p)},p)=1$

    又因为$x_{1} eq x_{2} eq ··· eq x_{φ(p)}$

    所以$a imes x_{1}mod p eq a imes x_{2}mod p eq ··· eq a imes x_{φ(p)}mod p$

    所以$S=Z_{p}$

    又因为

    左边$≡a^{φ(p)} imes x_{1} imes x_{2} imes ··· imes x_{φ(p)}(mod p)$

    $≡(a imes x_{1}) imes(a imes x_{2}) imes ··· imes (a imes x_{φ(p)})(mod p)$

    $≡(a imes x_{1}mod p) imes(a imes x_{2}mod p) imes ··· imes (a imes x_{φ(p)}mod p)(mod p)$

    $≡x_{1} imes x_{2} imes ··· imes x_{φ(p)}(mod p)≡$右边

    左右消去$x_{1} imes x_{2} imes ··· imes 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$,借用欧几里得算法的递归形式:

    设$$egin{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=lceilsqrt{p} ceil$,$x=im-j$

    $$a^{im-j}≡b(mod p)$$

    $$a^{im}≡b imes a^j(mod p)$$

    从$0$到$m$枚举$j$将$b imes a^j$加入哈希表,再从$1$到$m$枚举$i$找到最小的$im$使得$a^{im}≡b imes 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=lceilsqrt{p} ceil$,所以总时间复杂度是$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
    ");
            else printf("%lld
    ",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$以内的情况直接暴力判断,显然$rleq logp$,所以时间复杂度是对的;

    模板:

    Lucas定理

    求$$inom{n}{m} mod p$$

    其中$n$,$m$很大,而$p$很小,传统的阶乘求法会T,于是需要lucas定理:$$inom{n}{m}≡inom{n\% p}{m\% p} imesinom{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}$$

    那么$$inom{n}{m}≡prod_{i=0}^{k}inom{a_{i}}{b_{i}}mod p$$

    证明:

    把定理变式,设$n=ap+b,m=cp+d(b,d<p,a=lfloorfrac{n}{p} floor,c=lfloorfrac{m}{p} floor)$,那么:$$inom{n}{m}≡inom{a}{b} imesinom{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} floor imes p}(1+x)^b$$

    $$≡(1+x^p)^{lfloor frac{n}{p} floor}(1+x)^b$$

    $$≡sumlimits_{i=0}^{lfloor frac{n}{p} floor}inom{lfloor frac{n}{p} floor}{i}x^{pi}sumlimits_{j=0}^{b}inom{b}{j}x^j$$

    把式子左右两边$x^m$的系数提出来:

    $$左边=inom{n}{m}$$

    $$右边=inom{lfloorfrac{n}{p} floor}{i}inom{b}{j},其中pi+j=m,j<p$$

    $$=inom{lfloorfrac{n}{p} floor}{lfloorfrac{m}{p} floor}inom{b}{d}$$

    $$=inom{a}{b}inom{c}{d}$$

    证毕.

    实际题目中$p$比较小的话可以线性预处理阶乘和逆元。

    CRT&扩展CRT

    老祖宗的智慧(大雾)

    求解同余方程组:

    $$egin{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=prodlimits_{i=1}^{k}p_i$,$t_i$为同余方程$frac{P}{p_i}t_i≡1(mod p_i)$的最小非负整数解;

    则方程组有一解为:

    $$x=sum_{i=1}^{k}a_it_ifrac{P}{p_i}$$

    通解为:

    $$x+i imes P(i∈Z)$$

    显然最小非负整数解为$(x\%P+P)\%P$

    证明:

    ∵$frac{P}{p_i}$是除了$p_i$以外所有$p$的倍数

    ∴$∀j≠i,a_it_ifrac{P}{p_i}≡0(mod p_j)$

    又∵$frac{P}{p_i}t_i≡1(mod p_i)$

    ∴$a_it_ifrac{P}{p_i}≡a_i(mod p_i)$

    代入$x=sumlimits_{i=1}^{k}a_it_ifrac{P}{p_i}$显然原方程组成立;

    求$t_i$的过程可以用exgcd实现.

    模板:

    扩展CRT:$p_1,p_2,...,p_k$不一定两两互质

    这时可以把方程两两合并,最后的解就是整个方程组的解;

    设有两个同余方程:

    $$egin{cases}x≡a_1(mod p_1) \x≡a_2(mod p_2)end{cases}$$

    把mod去掉就是:

    $$egin{cases}x=p_1x_1+a_1 \x=p_2x_2+a_2end{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)=sumlimits_{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}^{lfloorfrac{n}{d} floor}f(i)$$

    $$=sum_{d=1}^{n}g(d)S(lfloorfrac{n}{d} floor)$$

    这一步超帅!!!

    $$sum_{i=1}^{n}h(i)=g(1)S(n)+sum_{d=2}^{n}g(d)S(lfloorfrac{n}{d} floor)$$

    $$g(1)S(n)=sum_{i=1}^{n}h(i)-sum_{d=2}^{n}g(d)S(lfloorfrac{n}{d} floor)$$

    显然可以构造一个很好求前缀和的$h(i)$,再对后半部分数论分块+记忆化搜索;

    当线性筛预处理到$n^{frac{2}{3}}$时时间复杂度达到最优:$O(n^{frac{2}{3}})$

    常见的积性函数:

    $$sum_{i=1}^{n}mu(i)=1-sum_{d=2}^{n}S(lfloorfrac{n}{d} floor)$$

    原理是$mu*I=epsilon$

    $$sum_{i=1}^{n}varphi(i)=frac{n*(n+1)}{2}-sum_{d=2}^{n}S(lfloorfrac{n}{d} floor)$$

    遇到不熟的积性函数就按照性质配吧……貌似没有什么通配的方法

    洲阁筛&min_25筛

    伯努利数&自然数幂求和

    $$B_0=1$$

    $$sumlimits_{k=1}^{n}inom{n+1}{k}B_k=0$$

    递推式:

    $$B_n=-frac{1}{n+1}sum_{i=0}^{n-1}inom{n+1}{i}B_i$$

    关于自然数幂求和:

    $$sum_{i=1}^{n}i^k=frac{1}{k+1}sum_{i=1}^{k+1}inom{k+1}{i}B_{k-i+1}(n+1)^i$$

    合起来就可以$O(n+k^2)$预处理

    证明怎么可能会呢……

    牛顿迭代法

    解实数方程

    解多项式方程

    矩阵&行列式

    矩阵树定理

    生成函数

    普通生成函数

    一个数列$langle a_0,a_1,a_2,cdots angle$的生成函数可以被表示为一个辅助变量$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优化

    *二项式定理&范德蒙德卷积

    序列$langleinom{r}{0},inom{r}{1},inom{r}{2},cdots angle$的生成函数是$(1+z)^r$(二项式定理)

    即:

    $$(1+z)^r=sum_{kgeq 0}inom{r}{k}z^k$$

    两个自乘即可得到范德蒙德卷积:

    $$sum_{k=0}^{n}inom{r}{k}inom{s}{n-k}=inom{r+s}{n}$$

    *五边形数和整数拆分问题

    指数生成函数

    序列$langle g_n angle$的指数生成函数(egf)是幂级数:

    $$hat{G}(z)=sum_{k=0}^{infty}g_kfrac{z^k}{k!}$$

    为什么叫指数生成函数?因为:

    $$e^x=sum_{n=0}^{infty}frac{x^n}{n!}$$

    即$e^x$是数列$langle1,1,1,cdots angle$的egf.

    一类图论计数问题

    【BZOJ3456】城市规划

    【XSY3368】青春野狼不做小恶魔学妹的梦

    prufer序列

    莫比乌斯反演

    看这里

    斯特林数

    第一类

    $egin{bmatrix}n\mend{bmatrix}$(也可以表示为$s(n,m)$)表示把$n$个元素划分成$m$个轮换的方案数;

    递推式:

    $$egin{bmatrix}n\mend{bmatrix}=egin{bmatrix}n-1\m-1end{bmatrix}+(n-1)egin{bmatrix}n-1\mend{bmatrix}$$

    第二类

    $egin{Bmatrix}n\mend{Bmatrix}$(也可以表示为$S(n,m)$)表示把$n$个元素划分成$m$个非空子集的方案数;

    递推式:

    $$egin{Bmatrix}n\mend{Bmatrix}=egin{Bmatrix}n-1\m-1end{Bmatrix}+megin{Bmatrix}n-1\mend{Bmatrix}$$

    通项公式:

    $$egin{Bmatrix}n\mend{Bmatrix}=frac{1}{m!}sum_{k=0}^{m}(-1)^kinom{m}{k}(m-k)^n$$

    组合意义:枚举子集个数,其他随便放,由于子集视作相同的所以最后除以$m!$

    把上式拆掉组合数可得:

    $$egin{Bmatrix}n\mend{Bmatrix}=sum_{k=0}^{m}(-1)^k imesfrac{1}{k!} imesfrac{(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}egin{Bmatrix}k\iend{Bmatrix}inom{n}{i}i!$$

    组合意义左边求$k$个球放在$n$个盒子里的方案数,右边先枚举非空盒子数,再从中选出$i$个盒子,把$k$个球放在这$i$个盒子里;

    也可以写成:

    $$n^k=sum_{i=0}^{k}egin{Bmatrix}k\iend{Bmatrix}n^{underline{i}}$$

    斯特林反演

    若函数$f,g$满足:

    $$f(n)=sum_{i=1}^{n}egin{Bmatrix}n\iend{Bmatrix}g(i)$$

    则:

    $$g(n)=sum_{i=1}^{n}(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}f(i)$$

    证明咕咕咕,详见这篇博客

    主要推容斥系数的时候会用吧。。。

    二项式反演

    设两个函数$f,g$满足:

    $$g(i)=sum_{j=1}^{i}inom{i}{j}f(j)$$

    则:

    $$f(i)=sum_{j=1}^{i}(-1)^{i-j}inom{i}{j}g(j)$$

    另一种形式,若有:

    $$g(i)=sum_{j=1}^{i}(-1)^jinom{i}{j}f(j)$$

    则:

    $$f(i)=sum_{j=1}^{i}(-1)^jinom{i}{j}f(j)$$

    证明(第一种形式):

    把$g$的定义代入可得:

    $$f(i)=sum_{j=1}^{i}(-1)^{i-j}inom{i}{j}sum_{k=1}^{j}inom{j}{k}f(k)$$

    考虑$f(k)$在每次求和时的贡献,$f(k)$的系数就是:

    $$sum_{j=k}^{i}(-1)^{i-j}inom{i}{j}inom{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)!} ight) imesfrac{i!}{k!}$$

    $$=left(sum_{j=k}^{i}(-1)^{i-j}frac{(i-k)!}{(i-j)!(j-k)!} ight) imesfrac{i!}{k!(i-k)!}$$

    $$=left(sum_{j=k}^{i}(-1)^{i-j}inom{i-k}{j-k} ight) imesinom{i}{k}$$

    显然左边的式子相当于$i-k$的二项式系数错位相减,根据二项式定理可以全部消掉,即当$i eq k$时,左式为0;当$i=k$时,易得左右均为1,因此二项式反演得证。

    min_max容斥

    最值反演

    设$S$是一个集合,$min(S)$和$max(S)$分别表示其中的最大值和最小值,则有:

    $$max(S)=sum_{Tsubseteq S}(-1)^{|T|+1}min(T)$$

    $$min(S)=sum_{Tsubseteq S}(-1)^{|T|+1}max(T)$$

    最值反演在期望情况下也成立:

    $$mathbb{E}[max(S)]=sum_{Tsubseteq S}(-1)^{|T|+1}mathbb{E}[min(T)]$$

    证明从容斥的角度入手,首先当且仅当$T={max(S)}$时$min(T)=max(S)$,对于其余的所有$T$,至少存在一个集合中的数$x$使得$min(Tcup{x})=min(T)$,设对于其中一个集合有$k$个这样的$x$,显然从中选出奇数个或偶数个的方案数是相等的,所以全部都会被抵消掉,最终累加的答案只剩$max(T)$。

    k大值反演

    就是上面那个东西的扩展形式……

    要求$kthmax(S)$,试构造函数$f$满足:

    $$kthmax(S)=sum_{Tsubseteq S}f(|T|)min(T)$$

    考虑集合$S$中第$i$大的元素,若$min(T)=i$,则$T$中只会出现大于$i$的元素,这样的元素共$i-1$个,所以$i$的贡献就是:

    $$sum_{j=0}^{i-1}inom{i-1}{j}f(j+1)$$

    那么构造出的$f$就需要满足:

    $$sum_{j=0}^{i-1}inom{i-1}{j}f(j+1)=[i==k]$$

    等价于:

    $$sum_{j=0}^{i}inom{i}{j}f(j+1)=[i==k-1]$$

    设$g(i)=[i==k-1]$,容易发现这是个二项式反演的形式(有0是一样的),那么:

    $$f(i+1)=sum_{j=0}^{i}(-1)^{i-j}inom{i}{j}g(j)$$

    注意这里是$f(i+1)$是因为前面枚举的是$f(j+1)$,反演回来同样要加回1;

    根据$g$的定义可得当且仅当$j=k-1$时右边的值才不为零,所以其他项全部都没有意义,即:

    $$f(i+1)=(-1)^{i-k+1}inom{i}{k-1}$$

    $$f(i)=(-1)^{i-k}inom{i-1}{k-1}$$

    这就是我们要求的$f$,代回最初的式子:

    $$kthmax(S)=sum_{Tsubseteq S}(-1)^{|T|-k}inom{|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)=sumlimits_{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 eq n$的时候,有

    $$g^{i-n-1}(x)g'(x)=frac{1}{i-n}(g^{i-n})'(x)$$

    而分式环$F((x))$中的任意一个函数求导之后-1次项均为0,所以$(1)$式中左边$i eq n$的项均为0,所以

    $$[x^{-1}]na_nfrac{g'(x)}{g(x)}=[x^{-1}]frac{1}{g^n(x)}$$

    把$frac{g'(x)}{g(x)}$展开:

    $$frac{g'(x)}{g(x)}=frac{sumlimits_{i=1}^{infty}is_ix^{i-1}}{sumlimits_{i=1}^{infty}s_ix^i}$$

    $$=frac{sumlimits_{i=1}^{infty}is_ix^{i-1}}{s_1x} imesfrac{1}{1+sumlimits_{i=1}^{infty}frac{s_{i+1}}{s_1}x^i}$$

    $$=left(x^{-1}+sum_{i=0}^{infty}s_{i+2}x^i ight)left(1-zleft(sum_{i=0}^{infty}frac{s_{i+2}}{s_1}x^i ight) ight)$$

    所以

    $$[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引理

    简单微积分

    求导&积分

    不定积分

    微分方程

  • 相关阅读:
    Android_AyscnTask
    Android_handler
    Android_网络操作
    Android_网络基础
    Android_Fragment
    Android_activity 生命周期
    Android-Dialog
    android_menu
    Android-约束布局
    andorid_相对布局小练习
  • 原文地址:https://www.cnblogs.com/dcdcbigbig/p/9390707.html
Copyright © 2020-2023  润新知