P6667 [清华集训2016] 如何优雅地求和 题解

news/2024/11/6 9:48:56/文章来源:https://www.cnblogs.com/JiaY19/p/18529316

一道非常有启发性的题目。

思路

考虑对于一个给出点值的多项式函数如何处理。

我们发现,对于一个 \(m\) 次多项式 \(f(x)\),由于 \(\binom{x}{i}\)\(i\) 次多项式,所以说我们必定可以把一个多项式函数写成如下模样:

\[F(k)=\sum_{i=0}^m\binom{k}{i}f_i \]

可以看出,\(f_i\) 实际上是非常好得到的。

我们可以进行二项式反演。

\[\begin{align} f_k&=\sum_{i=0}^m \binom{k}{i}(-1)^{k-i}F(i)\nonumber \\ &=k!\sum_{i=0}^m \frac{F(i)}{i!}\frac{(-1)^{k-i}}{(k-i)!}\nonumber \end{align} \]

卷积处理即可。

这样的话我们就可以使用简单的组合数快速求出多项式的点值。

感觉这个操作还是很巧妙的,可能还比较通用。

对于这道题,剩下的部分就很简单了,我们可以:

\[\begin{align} &=\sum_{k=0}^n\sum_{i=0}^m\binom{k}{i}f_i\binom{n}{k}x^k(1-x)^{n-k}\nonumber\\ &=\sum_{i=0}^mf_i\sum_{k=0}^n\binom{k}{i}\binom{n}{k}x^k(1-x)^{n-k}\nonumber\\ &=\sum_{i=0}^mf_i\sum_{k=0}^n\frac{n!k!}{k!(n-k)!i!(k-i)!}x^k(1-x)^{n-k}\nonumber\\ &=\sum_{i=0}^mf_i\frac{n!}{i!}\sum_{k=0}^n\frac{1}{(n-k)!(k-i)!}x^k(1-x)^{n-k}\nonumber\\ &=\sum_{i=0}^mf_i\frac{n!}{i!(n-i)!}\sum_{k=0}^n\frac{(n-i)!}{(n-k)!(k-i)!}x^k(1-x)^{n-k}\nonumber\\ &=\sum_{i=0}^mf_i\binom{n}{i}\sum_{k=0}^n\binom{n-i}{k-i}x^k(1-x)^{n-k}\nonumber\\ &=\sum_{i=0}^mf_i\binom{n}{i}\sum_{k=0}^{n-i}\binom{n-i}{k}x^{k+i}(1-x)^{n-k-i}\nonumber\\ &=\sum_{i=0}^mf_ix^i\binom{n}{i}\sum_{k=0}^{n-i}\binom{n-i}{k}x^{k}(1-x)^{n-i-k}\nonumber\\ &=\sum_{i=0}^mf_ix^i\binom{n}{i} (x+1-x)^{n-i}\nonumber\\ &=\sum_{i=0}^mf_ix^i\binom{n}{i}\nonumber\\ \end{align} \]

复杂度瓶颈在前面的处理 \(f_i\)

时间复杂度:\(O(m\log m)\)

Code

#include <bits/stdc++.h>
using namespace std;const int mod = 998244353;
const int G = 3;
const int I = 332748118;int n, m, x, k;
int a[20010];
int fc[20010];
int iv[20010];
int f[1 << 16];
int g[1 << 16];
int b[1 << 16];
int w[1 << 16];inline int power(int x, int y) {int res = 1;while (y) {if (y & 1) res = 1ll * res * x % mod;x = 1ll * x * x % mod, y >>= 1;}return res;
}
inline void init(int n) {int x = __lg(n) + 1;if (k == (1 << x)) return;k = (1 << x);for (int i = 0; i < k; i++)b[i] = (b[i >> 1] >> 1) | ((i & 1) ? (k >> 1) : 0);
}
inline void ntt(int *f, int n, int flag) {init(n), w[0] = 1;for (int i = 0; i < k; i++) if (i < b[i]) swap(f[i], f[b[i]]);for (int i = 1; i < k; i <<= 1) {int b = i << 1;int w0 = power((flag ? G : I), (mod - 1) / b);for (int j = 1; j < i; j++) w[j] = 1ll * w[j - 1] * w0 % mod;for (int j = 0; j < k; j += b) {for (int l = 0; l < i; l++) {int x = f[j + l], y = 1ll * f[j + l + i] * w[l] % mod;f[j + l] = (x + y >= mod ? x + y - mod : x + y);f[j + l + i] = (x - y < 0 ? x - y + mod : x - y);}}}if (flag == 0) {int iv = power(k, mod - 2);for (int i = 0; i < k; i++) f[i] = 1ll * f[i] * iv % mod;}
}int main() {cin >> n >> m >> x;for (int i = 0; i <= m; i++) cin >> a[i];fc[0] = 1;for (int i = 1; i <= m; i++) fc[i] = 1ll * fc[i - 1] * i % mod;iv[m] = power(fc[m], mod - 2);for (int i = m; i >= 1; i--) iv[i - 1] = 1ll * iv[i] * i % mod;for (int i = 0; i <= m; i++) {f[i] = 1ll * a[i] * iv[i] % mod;g[i] = (i & 1 ? mod - iv[i] : iv[i]);}ntt(f, m + m, 1);ntt(g, m + m, 1);for (int i = 0; i < k; i++)f[i] = 1ll * f[i] * g[i] % mod;ntt(f, m + m, 0);int sm = 1;int ns = 0;for (int i = 0; i <= m; i++) {ns = (ns + 1ll * sm * f[i]) % mod;sm = (1ll * sm * x) % mod;sm = (1ll * sm * (n - i)) % mod;}cout << ns << "\n";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827513.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[GXYCTF2019]Ping Ping Ping 1 - Xxiaoma解题

打开后,发现显示一个 /?ip= 我们直接在url里添加/?ip=127.0.0.1,发现有回显,这时候就可以用分号;来进行命令链接执行了。 输入url/?ip=127.0.0.1;ls 回显出来两个php文件!直接构造payload:/?ip=127.0.0.1;cat /flag.php才发现没那么简单,回显过滤了空格,可以使用$IFS…

manim边学边做--三维的点和线

Manim 提供了一系列专为三维空间设计的对象,让创建三维数学动画变得更加轻松。 本篇开始介绍其中最简单的点和线相关对象,也就是Dot3D(三维的点),Line3D(三维的线)和Arrow3D(三维的箭头)。Dot3D用于表示三维空间中的点,是构建其他复杂三维图形的基础,它适用于标记关…

洛谷题单指南-二叉堆与树状数组-P2168 [NOI2015] 荷马史诗

原题链接:https://www.luogu.com.cn/problem/P2168 题意解读:把单次替换成k进制字符串,使得替换后文本内容最短,典型的哈夫曼编码应用。 解题思路: 要把单词转成k进制字符串,根据哈夫曼编码的原理,可以依次将k个出现次数最少的单词进行合并,最后得到一棵树,每个非叶节…

.Net Core NPOI 导出多级表头

想要导出这样的表格 数据准备格式附上源码1 using NPOI.HSSF.UserModel;2 using NPOI.SS.UserModel;3 using NPOI.SS.Util;4 using System.Data;5 using System.Text.RegularExpressions;6 7 namespace TestConsoleApp8 {9 /// <summary>10 /// 导出Excel11 …

Nacos原理汇总

今天就应某位小伙伴的要求,来讲一讲Nacos作为服务注册中心底层的实现原理不知你是否跟我一样,在使用Nacos时有以下几点疑问:临时实例和永久实例是什么?有什么区别? 服务实例是如何注册到服务端的? 服务实例和服务端之间是如何保活的? 服务订阅是如何实现的? 集群间数据…

人工智能模型训练中的数据之美——探索TFRecord

上一篇:《构建人工智能模型基础:TFDS和Keras的完美搭配》 序言:在人工智能模型的训练过程中,如何高效管理和处理大量数据是一个重要的课题。TensorFlow 的 TFRecord 格式为大规模数据存储和处理提供了一种灵活且高效的解决方案。在本节知识中,我们将介绍如何利用 TFRecord…

教师提前批试讲-注意事项

教师提前批试讲-注意事项

大白菜装系统

在平时工作中,作为程序员,最苦逼的是公司的电脑坏了,都找你。我想说我是程序员,不是修电脑的,但是架不住小姐姐的热情,还是做了。 装系统流程: 第一步:前期准备 1、使用【大白菜】制作U盘启动盘。 2、查询机型的U盘启动快捷键。 3、准备一个ISO/GHO镜像。 第二步:插入…

实验11:装饰模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解装饰模式的动机,掌握该模式的结构; 2、能够利用装饰模式解决实际问题。[实验任务一]:手机功能的升级用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而Ja…

Pbootcms网站,从Apache切换为Nginx后网站打不开

打开网站设置登录宝塔面板。 选择需要配置的网站,点击“设置”。进入伪静态设置在网站设置页面中,找到并点击“伪静态”选项卡。添加Nginx伪静态规则在伪静态设置中,清空原有规则或选择自定义规则。 输入以下Nginx伪静态规则:location / {if (!-e $request_filename){rewri…

2024/11/06

软件设计 实验10:组合模式 用透明组合模式实现教材中的“文件夹浏览”这个例子。 类图 public abstract class AbstractFile {public abstract void add(AbstractFile element);public abstract void remove(AbstractFile element);public abstract void display(int depth); …

SQLSTATE[HY000] [1045] Access denied for user ‘root‘@‘localhost‘ (using password: YES)

错误解析错误代码:SQLSTATE[HY000] [1045] 错误信息:Access denied for user ‘root’@‘localhost’ (using password: YES)可能的原因密码错误:提供的密码与数据库中存储的密码不匹配。 用户权限问题:用户root可能没有从localhost访问数据库的权限。 配置文件问题:MySQL…