zoukankan      html  css  js  c++  java
  • 插值在OI中的应用

    退役前写的东西

    • [集训队互测2012] calc

    题意:
    一个序列\(a_1,...,a_n\)是合法的:\(a_i\in [1,k]\)\(a_i\)互不相等。一个序列的值为\(\prod\limits a_i\),两个序列不同当且仅当他们任意一位不一样。求所有不同合法序列的值的和

    做法:
    \(f_{i,j}\)为前\(i\)个数取值\([1,j]\)的序列之和,考虑第\(i\)个数选不选\(j\),有\(f_{i,j}=f_{i-1,j-1}\times j+f_{i,j-1}\)
    \(f_{n,i}\)是关于\(i\)\(g_n\)次多项式
    \(f_{n,i}-f_{n,i-1}=f_{n-1,i-1}\times i\)
    左边是关于\(i\)\(g_n-1\)次多项式,右边是关于\(i\)\(g_{n-1}+1\)次多项式
    由初始情况\(g_0=0\)可得\(g_n=2n\)

    • 自然数幂和:\(S_k(n)=\sum\limits_{i=1}^n i^k\)

    \(S_k(n)\)是关于\(n\)\(k+1\)次多项式
    \(\begin{aligned} S_k(n)+(n+1)^k &=\sum\limits_{i=1}^{n+1}i^k\\ &=\sum\limits_{i=0}^n (i+1)^k\\ &=\sum\limits_{j=0}^k \binom{k}{j}\sum\limits_{i=0}^n i^j\\ &=\sum\limits_{j=1}^k \binom{k}{j}S_j(n)+n \end{aligned}\)
    \(k\)换成\(k+1\),有\((n+1)^{k+1}=(k+1)S_k(n)+\sum\limits_{j=1}^{k-1}\binom{k+1}{j}S_j(n)+n\)

    • BZOJ3453

    题意:
    \(f(n)=\sum\limits_{i=0}^n \sum\limits_{j=1}^{a+ib}\sum\limits_{x=1}^j x^k (k\le 123,n,a,b\le 10^9)\)

    做法:
    \(g_k(n)=\sum\limits_{i=1}^n \sum\limits_{j=1}^i j^k\)
    与自然数幂和类似:
    \(\begin{aligned}\\ g_k(n)+\sum\limits_{j=1}^{n+1}j^k&=\sum\limits_{i=1}^{n+1}\sum\limits_{j=1}^i j^k\\ &=\sum\limits_{i=0}^n \sum\limits_{j=0}^i (j+1)^k\\ &=\sum\limits_{d=0}^k {k\choose d}\sum\limits_{i=0}^n g_d(n)(这里省了点没必要的东西)\\ \end{aligned}\)
    \(k\)换成\(k+1\)
    \((k+1)g_k(n)=f_{k+1}(n+1)-\sum\limits_{d=1}^{k-1}{k+1\choose d}g_d(n)\)
    \(g_k(n)\)为关于\(n\)\(k+2\)多项式
    同理答案为\(k+3\)的多项式

    • 51nod1822

    题意:
    \(S_k(n)=\sum\limits_{i=1}^n i^k r^i\),要求\(O(k)\)求解

    做法:
    \(\begin{aligned}(r-1)S_k(n)&=r^{n+1}n^k-r+\sum\limits_{i=2}^n r^i((i-1)^k -i^k)\\&=r^{n+1}n^k-r+\sum\limits_{j=0}^{k-1}\binom{k}{j}(-1)^{k-j}(S_j(n)-r)\\&=r^{n+1}n^k+\sum\limits_{j=0}^{k-1}\binom{k}{j}(-1)^{k-j}S_j(n)\end{aligned}\)
    \(S_k(n)=\frac{1}{r-1}(r^{n+1}n^k+\sum\limits_{j=0}^{k-1}\binom{k}{j}(-1)^{k-j}S_j(n))~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(1)\)
    展开一下:
    \(\begin{aligned} & S_0(n)=r^{n+1}\cdot \frac{1}{r-1}-r\cdot (\frac{1}{r-1})\\ & S_1(n)=r^{n+1}\cdot(\frac{n}{r-1}-\frac{1}{(r-1)^2})-r\cdot(-\frac{1}{(r-1)^2})\\ & S_2(n)=r^{n+1}\cdot(\frac{n^2}{r-1}-\frac{2n}{(r-1)^2}+\frac{2}{(r-1)^3}+\frac{1}{(r-1)^2})-r\cdot(\frac{2}{(r-1)^3}+\frac{1}{(r-1)^2}) \end{aligned}\)
    猜想存在关于\(n\)\(k\)次多项式\(F_k(n)\)使得\(S_k(n)=r^{n+1}F_k(n)-rF_k(0)\)
    根据\((1)\)
    \(\begin{aligned}S_k(n)&=\frac{r^{n+1}n^k+\sum\limits_{j=0}^{k-1}(-1)^{k-j}{k\choose j}S_j(n)}{r-1}\\ &=\frac{r^{n+1}n^k+\sum\limits_{j=0}^{k-1}(-1)^{k-j}{k\choose j}[r^{n+1}F_j(n)-rF_j(0)]}{r-1}\\ &=r^{n+1}\cdot (\frac{n^k+\sum\limits_{j=0}^{k-1}(-1)^{k-j}{k\choose j}F_j(n)}{r-1})+r\cdot(\frac{\sum\limits_{j=0}^{k-1}(-1)^{k-j}{k\choose j}F_j(0)}{r-1}) \end{aligned}\)
    \(F_k(n)=\frac{1}{r-1} (n^k+\sum\limits_{j=0}^{k-1}(-1)^{k-j}{k\choose j}F_j(n))\),其中\({k\choose j}\)可看作常数,即猜想合理
    \(F_k(n)\)写成这个样子:\(F_k(n)=\sum\limits_{i=0}^k {k\choose i}a_i\)
    引理\(\forall 0\leq m\leq k,\sum\limits_{i=0}^k(-1)^{i}{k\choose i}{i\choose m}=0\)
    \(\begin{aligned} .~~~~~~~~证明:&\\ &\sum\limits_{i=0}^k(-1)^{i}{k\choose i}{i\choose m}=\sum_{i=0}^k(-1)^{i}{k\choose m}{k-m\choose i-m}\\ &~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~={k\choose m}\sum_{i=0}^{k-m}(-1)^{i+m}{k-m\choose i}\\ &~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~={k\choose m}(-1)^m(1-1)^{k-m}\\ &~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=0\\ \end{aligned}\)
    故:\(\sum\limits_{i=0}^k (-1)^i{k\choose i}F_k(i)=\sum\limits_{j=0}^k a_j\sum\limits_{i=0}^k (-1)^i {k\choose i}{i\choose j}=0~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(2)\)
    根据\(F\)\(S\)的关系得到:\(S_k(n+1)=r^{n+2}F_k(n+1)-rF_k(n)\)
    根据定义式有:\(S_k(n+1)=S_k(n)+(n+1)^k r^{n+1}\)
    从而得到
    \(\begin{aligned}\\r^{n+2}F_k(n+1)-rF_k(n)&=S_k(n)+(n+1)^k r^{n+1}\\r^{n+2}F_k(n+1)-rF_k(n)&=r^{n+1}F_k(n)-rF_k(0)+(n+1)^k r^{n+1}\\F_k(n+1)&=\frac{1}{k}(F_k(n)+(n+1)^k)\end{aligned}\)
    故我们可以用\(F_k(0)\)表示出\(F_k(i)\),然后代入\((2)\)解得\(F_k(0)\),在解得\(F_k(i)\),拉格朗日插值即可求得\(F_k(x)\)的系数

    • CF995F

    题意:
    给定一棵\(n\)阶树,你要给每个点定一个\([1,D]\)的权值,满足每个点权值不大于父亲。问有多少种方案。\(n\le 3000,D\le 10^9\)

    做法:
    \(f_{u,j}\)\(u\)选择值\(j\)的子树方案数,\(g_{u,j}=\sum\limits_{i=1}^j f_{u,i}\)
    \(f_{u,j}=\prod\limits_{v\in son}g_{v,j}\)
    \(g_{u,j}\)是关于\(j\)\(size_u\)次多项式:从叶子节点开始归纳即可

    • CF917D

    题意:
    给定一棵有\(n\)个节点的无权无向树
    求对于这\(n\)个点,以及每个\(k=0,1,2...n-1\),有多少棵由这\(n\)个点之间的边构造成的树,与给定的树恰好有\(k\)条边重复

    做法:
    边在树上把权值看作\(x\),否则看作\(1\)。于是一棵树的总权值为\(x^k\)\(k\)为原边数量。
    把权值放到矩阵里解行列式是很难的,但我们知道行列式是个最高次为\(n-1\)的多项式,直接插值就好了

    • XSY1537

    题意:
    \(n\)个点,\(m\)条有颜色的边,颜色为红色蓝色和绿色,对于所有满足\(r+b+g=n−1\)的三元组\((r,b,g)\),求恰有\(r\)条红色的边,\(b\)条蓝色的边,\(g\)条绿色的边的生成树个数。

    做法:
    三种边分别为\(1,x,x^n\)

    • CF1086F

    题意:
    有一个无限大的网格图,在第\(0\)秒的时候,有\(n\)个格子会着火,每隔一秒,一个着火的格子会导致和它八连通的未着火的格子着火,定义一个着火格子的权值为它最早着火的时间,求tt秒之后所有着火格子的权值和。\(n\le 50,-10^8\le x_i,y_i\le 10^8,0\le t\le 10^8\)

    做法:
    当一个格子第\(x\)秒开始着火时统计\(x\),题意转换\(f(n)\)表示\(n\)时刻着火的个数
    \(ans=\sum\limits_{i=0}^t f(t)-f(i)=(t+1)f(t)-f(i)\)
    考虑\(n=1\)\(f(t)\)为关于\(t\)的二次函数;考虑\(n=2\),当不相交时是两个二次函数,相加仍是二次函数,相交是还要减交面积,减二次函数,答案仍是二次函数。
    也就是是个分段的二次函数,而相交的次数即分段的段数,\(O(n^2)\)的段数

    • XSY2751

    题意:
    已知\(f(x)\)\(k\)次多项式。给你\(f(0),f(1),...,f(k)\),求

    \[\sum\limits_{i=1}^n f(i)q^i \]

    \(k\le 500000,n\le 10^{18}\)

    做法:
    \(q=0\):答案为\(f(0)\)
    \(q=1\)\(S(n)=\sum\limits_{i=0}^n f(i)\),显然为\(k+1\)次多项式
    \(q\neq 1\):记\(S(n)=\sum\limits_{i=0}^{n-1}f(i)q^i=q^n G(n)-G(0)\),其中\(G(n)\)是一个\(k\)次多项式
    证明:
    \(k=0\)时,\(S(n)\)为等比数列,显然成立
    假设当\(k=d-1\)时成立。当\(k=d\)
    \(\begin{aligned}\\ S(n)&=\sum_{i=0}^{n-1}f(i)q^i\\ qS(n)&=\sum_{i=0}^{n-1}f(i)q^{i+1}=\sum_{i=1}^nf(i-1)q^i\\ (q-1)S(n)&=f(n-1)q^n+\sum_{i=0}^{n-1}(f(i)-f(i-1))q^i+f(-1)\\ \end{aligned}\)
    因为\(f(n)-f(n-1)\)是一个\(d-1\)次多项式,根据归纳\(\sum\limits_{i=0}^{n-1}(f(i)-f(i-1))q^i\)可以被表示为\(q^nP(n)-P(0)\)
    所以\(S(n)\)一定能被表示为\(q^nG(n)-c\)\(G(n)=\frac{f(n-1)+P(n)}{q-1}\)\(c\)为常数
    因为\(f(n-1),P(n)\)是一个\(d\)次多项式,所以\(G(n)\)也是\(d\)次多项式
    .
    现在要算\(G(n)\),可以算出\(G(0),...,G(k)\)之后插值
    \(\begin{aligned} S(n)&=\sum_{i=0}^{n-1}f(i)q^i\\ S(n+1)-S(n)&=q^{n+1}G(n+1)-q^nG(n)=f(n)q^n\\ qG(n+1)&=G(n)+f(n)\\ G(n+1)&=\frac{G(n)+f(n)}{q} \end{aligned}\)
    每个\(G(n)\)都表示成\(a_iG(0)+b_i\)的形式
    由于\(G(n)\)是一个\(k\)次多项式,那么\(k+1\)次差分后的值为\(0\)

    \[\sum_{i=0}^{k+1}{(-1)}^{k+1-i}\binom{k+1}{i}G(i)=0 \]

  • 相关阅读:
    对象的创建过程以及super关键字的使用
    Java语言基础
    数据结构-思考总结
    ssh简化登录
    WebStorm设置eslint保存自动格式化
    Jmeter简单使用
    nodemon添加babel支持
    VueCli 添加自定义组件报错
    shell写一个压测脚本
    Vue v-for指令中 key 的必要性
  • 原文地址:https://www.cnblogs.com/Grice/p/15789495.html
Copyright © 2011-2022 走看看