插值在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)\),求
\(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\):