「知识点杂记」

第二类斯特林数

定义: \( \begin{Bmatrix} n\\ m\end{Bmatrix} \) 为 \(n\) 个数划分成 \(m\) 个集合的方案数。

递归式: \( \begin{Bmatrix} n\\ m\end{Bmatrix}= \begin{Bmatrix} n-1\\ m-1\end{Bmatrix}+m \begin{Bmatrix} n-1\\ m\end{Bmatrix} \) [根据组合意义理解]

常用式: \(x^{k}=\sum_{i=1}^{k}\begin{Bmatrix} k\\ i \end{Bmatrix}\binom{x}{i} i!\)

拉格朗日插值

应用: 对于一个多项式,我们可以 \(n^2\) 求出对应值 ( \(n\) 为项数 )
公式:

\[f(x)=\sum_{i=1}^{n}y_i\prod_{j=1,i\neq j}^{n}\frac{x-x_j}{x_i-x_j} \]

[正确性显然]

拉格朗日插值求多项式系数

对于上面的公式,我们先把常数提出
令:

\[g(i)=y_i\prod_{j=1,i\neq j}^{n}\frac{1}{x_i-x_j} \]

得:

\[f(x)=\sum_{i=1}^{n}g(i)\prod_{j=1,i\neq j}^{n}{x-x_j} \]

然后我们就可以模拟多形式乘,多项式除来得到系数

Code
inline void sleve() {
    for(re int x=1;x<=k+2;x++) { 
        xx[x]=x; 
        yy[x]=(yy[x-1]+qpow(x,k))%mol; 
    }
}
inline int inv(int a) { return qpow(a,mol-2); }
inline void wor() {
    sleve();
    for(re int i=1;i<=k+2;i++) {
        c[i]=1; 
        for(re int j=1;j<=k+2;j++) if(i!=j) (c[i]*=(xx[i]-xx[j]+mol)%mol)%=mol;
        c[i]=inv(c[i])*yy[i]%mol;
    }
    fs[0]=1;
    for(re int i=1;i<=k+2;i++) {
        for(re int j=k+1;j>=1;j--) fs[j]=(fs[j-1]+fs[j]*(mol-xx[i])%mol)%mol;
        (fs[0]*=(mol-xx[i]))%=mol;
    }
    for(re int i=1;i<=k+2;i++) {
        int ls=inv(mol-xx[i]);
        g[0]=fs[0]*ls%mol;
        for(re int j=1;j<=k+1;j++) g[j]=(fs[j]-g[j-1]+mol)%mol*ls%mol;
        for(re int j=0;j<=k+1;j++) (f[j]+=g[j]*c[i]%mol)%=mol;
    }
}

珂朵莉树

应用: 对于随机数据的有效优化,适用于统一大范围修改
(这里填了一个大坑)
我们可以快速算出区间覆盖问题,
一开始可以把 \(1~n\) 全插进 \(set\) 里,权值为0,
每插进一段区间,就把对应区间的权值改为1,最后询问区间和即可。

上一篇:半导体光放大器(SOA)的优势及其应用


下一篇:hadoop.shell命令