这个科技是用来 \(O(k+\log n)\) 求 \(\sum_{i=0}^n [x^i] f(x)p^i(x) \mod x^{k+1}\) 这个多项式的某些项数的线性组合 不过我只见过求第 $ k $ 项的,其中 \(f(x)\) 微分可导。

要直接说算法本身的话过于枯燥,从例题开始慢慢说吧。

例题1 CF932E

求:

\[\sum_{i=0}^n\binom n ii^k
\]

将 \(\binom n i\) 看成 \([x^i] (1+x)^n\),\(i^k\) 看成 \([\frac {x^k} {k!}] e^{ix}\),那么原式变成了:

\[[\frac {x^k} {k!}]\sum_{i=0}^n[x^i](1+x)^ne^{ix}
\]

相当于

\[[\frac {x^k} {k!}](e^x+1)^n
\]

当然你也可以将 \(i^k\) 直接看成 \([\frac {x^k} {k!}] e^{ix}\) 然后使用二项式定理得到上式。

这里已经可以保留 \((e^x+1) \mod x^{k+1}\),通过多项式快速幂 \(O(k\log k\log n)\) 计算答案了,但是我们显然不满足于此。

接下来是重要的一步:

设 \(F(z)=(z+1)^n,\mathcal F(z+1)=F(z+1) \mod z^{k+1}\)。

为什么这里是 \(z+1\) 而不是 \(z\) 呢?

实际上是因为这里的 \(z=e^x-1\),常数项为 \(0\)

为什么常数项一定要为 \(0\)?

考虑原式,你算的是 \(\sum_{i=0}^n [x^i] f(x)p^i(x)\),答案只截取到第 \(k\) 项,那么如果 \([x^0]p(x)=0\),我们就可以只求和到 \(k\)。

换而言之,高次项对答案没有贡献。

所以在这个算法中,在这一步中要设的是 \(\mathcal F(z+G(0))= F(z+G(0)) \mod x^{k+1}\)。

因为 \(\mathcal F(z+1)\) 是 \(F(z+1)\) 的前 \(k+1\) 次项,所以答案 \([\frac {x^k} {k!}]F(e^x)=[\frac {x^k} {k!}]\mathcal F(e^x)\)。

问题来了,我们如何得到 \(\mathcal F(z+1)\)?

我们对 \(F(z)\) 列出一个方程:

\[(z+1)F'(z)-nF(z)=0
\]

那么对于 \(\mathcal F(z+1)\),呢?

\[(z+2)\mathcal F'(z+1)-n\mathcal F(z+1)=0
\]

好像不对?

是不是多算了什么东西?

考虑到原本不应该有的 \([z^k] (z+2)F'(z+1)\) 突然出现,所以应该在右边加上这玩意儿。

\[(z+2)\mathcal F'(z+1)-n\mathcal F(z+1)=[z^{k+1}](z+1)F'(z)=(k-n)\binom n k z^k 2^{n-k}
\]

对这个提取系数就可以 \(O(k)\) 递推 \(\mathcal F(z+1)\) 了。

提取系数后得到:

\[\mathcal F[i]=\frac {(k-n)\binom n k\binom k {i-1}(-1)^{k-i+1}2^{n-k}+(n-i+1)\mathcal F[i-1]} i
\]

不过要注意 \(\mathcal F[0]\) 的值,咱还没有算。。。

注意 \(\mathcal F[0]\) 的定义是 \(\mathcal F(z+1)\) 的 \(0\) 次项,也就是:

\[[z^0]\sum_{i=0}^k [z^i]\mathcal F(z+1) (z-1)^i
\]

还记得 \(\mathcal F(z+1)=F(z+1) \mod x^{k+1}\) 吧?那么 \([z^i]\mathcal F(z+1)\) 就可以使用二项式定理计算了。

\[\sum_{i=0}^k([z^0] (z-1)^i) \times ([z^i] (z+2)^n)
\]
\[\sum_{i=0}^k(-1)^i \times \binom n i \times 2^{n-i}
\]

回到原式:

\[[\frac {x^k} {k!}]\mathcal F(e^x)=\sum_{i=0}^k e^{ix} [x^i]\mathcal F(x)
\]

也就是:

\[\sum_{i=0}^k i^k[x^i]\mathcal F(x)
\]

线性筛 \(id^k\) 就可以做到 \(O(k+\log n)\) 啦。

#include<cstdio>
typedef unsigned uint;
const uint M=5005,mod=1e9+7;
uint n,k,top,pri[M],pos[M],idk[M];uint F[M],p2[M],Ck[M],Cn[M],inv[M];
inline uint Add(const uint&a,const uint&b){
return a+b>=mod?a+b-mod:a+b;
}
inline uint Del(const uint&a,const uint&b){
return b>a?a-b+mod:a-b;
}
inline uint pow(uint a,uint b){
uint ans=1;
for(;b;b>>=1,a=1ull*a*a%mod)if(b&1)ans=1ull*ans*a%mod;
return ans;
}
inline void sieve(const uint&M){
register uint i,j,x;idk[1]=1;
for(i=2;i<=M;++i){
if(!pos[i])idk[pri[pos[i]=++top]=i]=pow(i,k);
for(j=1;j<=top&&(x=i*pri[j])<=M;++j){
idk[x]=1ull*idk[i]*idk[pri[j]]%mod;
if((pos[x]=j)==pos[i])break;
}
}
}
signed main(){
register uint i,x,ans=0;inv[0]=1;inv[1]=1;
scanf("%u%u",&n,&k);Cn[0]=Ck[0]=1;Ck[1]=k;Cn[1]=n;sieve(k);
for(i=2;i<=k;++i){
inv[i]=1ull*(mod-mod/i)*inv[mod%i]%mod;
Cn[i]=1ull*Cn[i-1]*(n-i+1)%mod*inv[i]%mod;
Ck[i]=1ull*Ck[i-1]*(k-i+1)%mod*inv[i]%mod;
}
if(n<=k){
for(i=1;i<=n;++i)ans=Add(ans,1ull*Cn[i]*idk[i]%mod);
return!printf("%u",ans);
}
x=pow(2,n-k);
for(i=k;i<=k;--i){
if(i&1)F[0]=Del(F[0],1ull*Cn[i]*x%mod);
else F[0]=Add(F[0],1ull*Cn[i]*x%mod);x=Add(x,x);
}
x=1ull*(n-k)*Cn[k]%mod*pow(2,n-k)%mod;
for(i=1;i<=k;++i){
if(k-i&1)F[i]=Del(1ull*(n-i+1)*F[i-1]%mod,1ull*x*Ck[i-1]%mod);
else F[i]=Add(1ull*(n-i+1)*F[i-1]%mod,1ull*x*Ck[i-1]%mod);
F[i]=1ull*F[i]*inv[i]%mod;
}
for(i=1;i<=k;++i)ans=Add(ans,1ull*idk[i]*F[i]%mod);
printf("%u",ans);
}

例题2 CF392C

求:

\[\sum_{i=0}^n fib_i \times i^k
\]

和上面一样:

\[[\frac {x^k} {k!}]\sum_{i=0}^n fib_i \times e^{ix}
\]

设 \(F(x)=\sum_{i=0}^{n} fib_i \times x^i = \frac 1 {1-x-x^2} \mod x^{n+1}\)。

\[[\frac {x^k} {k!}]F(e^x)
\]

如果不截取的话有:

\[F(z)=zF(z)+z^2F(z)+1
\]

截取后,右边多了 \(n+1\) 和 \(n+2\) 次项的贡献,应该减去。也就是:

\[F(z)=zF(z)+z^2F(z)+1-(fib_{n-1}+fib_n)z^{n+1}-fib_nz^{n+2}
\]
\[F(z)=\frac {1-(fib_{n-1}+fib_n)z^{n+1}-fib_nz^{n+2}} {1-z-z^2}
\]

因为需要求 \(F(e^x)\),所以还是设 \(\mathcal F(z+1)=F(z+1) \mod z^{k+1}\)。

再设一个 \(G(z)=1-(fib_{n-1}+fib_n)z^{n+1} -fib_nz^{n+2}\)

\[F(z+1)=-\frac {G(z+1)} {1+3z+z^2}
\]
\[F(z+1)=-(G(z+1)+3zF(z+1)+z^2F(z+1))
\]

原本在这里可以提取系数直接递推的,但是我们发现我们不会求 \(G(z+1)\)。。。

不过我们发现我们又回到了求一个 \(\rm GF\) 的问题,可以继续使用这个科技。

再设一个 \(\mathcal G(z+1)=G(z+1) \mod z^{k+1}\)。

考虑一个:

\[H_n(z+1)=(z+1)^n \mod x^{k+1}
\]

有:

\[\mathcal G(z+1)=1-(fib_{n-1}+fib_n)H_{n+1}(z+1)-fib_nH_{n+2}(z+1)
\]

所以只需要将 \(H_{n+1}(z+1)\) 和 \(H_{n+2}(z+1)\) 递推出来就可以递推 \(\mathcal G(z+1)\)。

利用求导有:

\[(z+1)((z+1)^n)'=n((z+1)^n)
\]
\[(z+1)H_n'(z+1)=nH_n(z+1)+(n-k)\binom n kz^k
\]

于是可以递推 \(H_{n+1}(z+1),H_{n+2}(z+1)\) 和 \(\mathcal G(z+1)\)。

回代:

\[[z^i]\mathcal F(z+1)=[i=k+1](3([z^k]\mathcal F(z+1))+([z^{k-1}]\mathcal F(z+1)))+[i=k+2]([z^k]\mathcal F(z+1))-([z^i]\mathcal G(z+1)+3[z^{i-1}]\mathcal F(z+1)+[z^{i-2}]\mathcal F(z+1))
\]

感觉好麻烦啊。。。

为了方便,设 \(a=3([z^k]\mathcal F(z+1))+([z^{k-1}]\mathcal F(z+1)),b=[z^k]\mathcal F(z+1)\)。

将上式化简:

\[\mathcal F(z+1)=\frac {az^{k+1}+bz^{k+2}-\mathcal G(z+1)} {1+3z+z^2}
\]

也就是:

\[\mathcal F(z)=\frac {a(z-1)^{k+1}+b(z-1)^{k+2}-\mathcal G(z)} {1-z-z^2}
\]

这下可以递推 \(\mathcal F(z)\) 啦。

回代的结果和例题1一样,都是 \(\sum_{i=0}^k i^k[ x^i ]\mathcal F(x)\)。

总结

计算 \(F(G(x))\) 时,设:

\[\mathcal F(z+G(0))=\mathcal F(z+G(0)) \mod z^{k+1}
\]

然后通过求导列出关于 \(F(z+1)\) 的方程,将 \(F\) 替换为 \(\mathcal F\) 后加上/减去被少算/多算的项,然后提取系数继续递推。

只不过列出方程后求解的方法多种多样罢了。

参考资料:

Elegia 「实验性讲稿」载谭 Binomial Sums 详解

Elegia 载谭 Binomial Sum:多项式复合、插值与泰勒展开

GuidingStar CF932E题解

GuidingStar 载谭 Binomial Sum 小练习

把EI科技 【载谈 Binomial Sum】 用人话说出来的更多相关文章

  1. LGP6667题解

    既然看到了这道"板子",那还是来写一下题解吧... 如果有机会希望能推一下 载谈binominial sum 的做法. \[\sum_{k=0}^nf(k)\binom n kx^ ...

  2. iOS UIlabel怎么加载html字符串 富文本的用法

    要加载html字符串,用人说,直接用webView啊!但是,有时候我们只需要显示2行文字,如此少的内容却要在复杂的UI排版中加入一个占用资源较多的webview,得不偿失.这里要说的是,我们其实可以用 ...

  3. 点分治&&动态点分治学习笔记

    突然发现网上关于点分和动态点分的教程好像很少……蒟蒻开篇blog记录一下吧……因为这是个大傻逼,可能有很多地方写错,欢迎在下面提出 参考文献:https://www.cnblogs.com/LadyL ...

  4. DKT模型及其TensorFlow实现(Deep knowledge tracing with Tensorflow)

    今年2月15日,谷歌举办了首届TensorFlow Dev Summit,并且发布了TensorFlow 1.0 正式版. 3月18号,上海的谷歌开发者社区(GDG)组织了针对峰会的专场回顾活动.本文 ...

  5. [置顶] 2014年八大最热门IT技能

    根据Computerworld网站组织的年度预测调查,众多IT专业人士在2014年所面临的整体就业形势与今年基本持平——今年有33%的企业有计划增加IT部门的员工数量,而未来一年则有32%的企业有此打 ...

  6. C# ListView 控件和 INotifyPropertyChanged 接口

    ListView 控件和 DataGridView 控件 ListView 是跟 Winform 中 DataGridView 用法以及显示效果差不多的一个 WPF 控件,可以通过列表的方式方便的显示 ...

  7. BP神经网络算法推导及代码实现笔记zz

    一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的 ...

  8. ListView 控件和 INotifyPropertyChanged 接口

    原文:ListView 控件和 INotifyPropertyChanged 接口 ListView 控件和 DataGridView 控件 ListView 是跟 Winform 中 DataGri ...

  9. 为什么今天的L4无人驾驶无法到达终局(转)

    本文来自于公众号驭势未来,是驭势科技的微信公众平台,本博客收录的这篇文章版权作者吴甘沙,博客中仅对部分内容进行编辑. 作者:吴甘沙 原文链接:here 声明:文中的观点只代表版权作者的观点,本转载不涉 ...

随机推荐

  1. socket在php作用

    PHP 使用Berkley的socket库来创建它的连接.你可以知道socket只不过是一个数据结构.你使用这个socket数据结构去开始一个客户端和服务器之间的会话.这个服务器是一直在监听准备产生一 ...

  2. chmod以数字形式改变文件权限

    Linux文件的三种身份和四种权限,三种身份分别为: u:文件的拥有者 g:文件所属的群组 o:其他用户 对于每个身份,又有四种权限,分别为: r:读取文件的权限(read) w:写入文件的权限(wr ...

  3. 洛谷P1563 [NOIP2016 提高组] 玩具谜题

    题目链接:https://www.luogu.com.cn/problem/P1563 哈哈哈,这个题拿来一读是不是很吃惊hahaha,我刚开始读的时候吓了我一跳,这么长的题干,这么绕的题意,还有下面 ...

  4. 关于Miller-Rabin与Pollard-Rho算法的理解(素性测试与质因数分解)

    前置 费马小定理(即若P为质数,则\(A^P\equiv A \pmod{P}\)). 欧几里得算法(GCD). 快速幂,龟速乘. 素性测试 引入 素性测试是OI中一个十分重要的事,在数学毒瘤题中有着 ...

  5. LeetCode随缘刷题之盛最多水的容器

    package leetcode.day_01_30; /** * 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) .在坐标内画 n 条垂直线,垂直线 i的两个端 ...

  6. Solution -「CF 575G」Run for beer

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的无向图,边有边权,一个人初始速度为 \(1\),每走一条边速度 \(\div10\), ...

  7. html页面预览pdf文件使用插件pdfh5.js

    html预览pdf文件需要依赖pdf.js 移动端适配需要pdfh5.js 记录移动端适配pdfh5.js的用发 在线预览: https://www.gjtool.cn/pdfh5/pdf.html? ...

  8. 容器化 | 在 KubeSphere 中部署 MySQL 集群

    程润科 数据库研发工程师,目前从事 RadonDB MySQL Kubernetes 研发,热衷于研究数据库内核.K8s 相关技术. 张莉梅 高级文档工程师,目前负责数据库产品文档开发.维护和管理工作 ...

  9. 攻防世界Web_ics_05

    题目: 题目描述:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统 题目场景:   1.进入云平台设备中心界面,查看以下源码发现?page= ,(点下云平台设备维护中心url里也能出?page ...

  10. 【C# 异常处理】 开端

    异常概述 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是 ...