UOJ #269. 【清华集训2016】如何优雅地求和

题目链接

给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\)。

然后求:

\[Q(f,n,x) = \sum_{k = 0}^{n}f(k){n\choose k}x^k(1 - x) ^{n - k} \pmod{998244353}
\]

考虑一个很巧妙的变化:组合数多项式!

设:

\[f(n)=\sum_{i=0}^m\binom{n}{i}h_i
\]

可以这么玩的原因是\(\binom{n}{m}\)其实是一个关于\(n\)的\(m\)次的多项式。因为\(\binom{n}{m}=\frac{\prod_{i=1}^m(n-i+1)}{m!}\)。

这就能理解为什么输入的是\(m+1\)个点值了,因为这样我们就能用二项式反演来求出\(h\):

对于\(m<i\leq n\),我们直接认为\(h_i=0\),因为只需要\(m\)项的\(h\)就可以确定\(f\)了。

\[f(n)=\sum_{i=0}^n\binom{n}{i}h_i\\
\Rightarrow h_n=\sum_{i=0}^n (-1)^{n-i}\binom{n}{i}f_i
\]

写成卷积形式:

\[\frac{h_n}{n!}=\sum_{i=0}^n\frac{(-1)^{n-i}}{(n-i)!}\frac{f_i}{i!}
\]

再来算答案。

考虑对\(f\)的每一项计算:

\[\begin{align}
Q(f,n,x) &=\sum_{i=0}^mh_i\sum_{k=i}^n\binom{k}{i}\binom{n}{k}x^k(1-x)^{n-k} \\
\end{align}
\]

我们知道:

\[\binom{n}{i}\binom{i}{j}=\binom{n}{j}\binom{n-i}{i-j}
\]

所以:

\[\begin{align}
Q(f,n,x) &=\sum_{i=0}^mh_i\sum_{k=i}^n\binom{k}{i}\binom{n}{k}x^k(1-x)^{n-k} \\
&=\sum_{i=0}h_i\sum_{k=i}^n\binom{n}{i}\binom{n-i}{k-i}x^k(1-x)^{n-k}\\
&=\sum_{i=0}h_i\binom{n}{i}x^i \sum_{k=i}^n\binom{n-i}{k-i}x^{k-i}(1-x)^{n-k}\\
&=\sum_{i=0}h_i\binom{n}{i}x^i(x+1-x)^{n-i}\\
&=\sum_{i=0}h_i\binom{n}{i}x^i\\
\end{align}
\]

代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define N 20005
  4. using namespace std;
  5. inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
  6. const ll mod=998244353;
  7. ll ksm(ll t,ll x) {
  8. ll ans=1;
  9. for(;x;x>>=1,t=t*t%mod)
  10. if(x&1) ans=ans*t%mod;
  11. return ans;
  12. }
  13. int n,m,x;
  14. ll f[N];
  15. void NTT(ll *a,int d,int flag) {
  16. static int rev[N<<2];
  17. static ll G=3;
  18. int n=1<<d;
  19. for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<d-1);
  20. for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
  21. for(int s=1;s<=d;s++) {
  22. int len=1<<s,mid=len>>1;
  23. ll w=flag==1?ksm(G,(mod-1)/len):ksm(G,mod-1-(mod-1)/len);
  24. for(int i=0;i<n;i+=len) {
  25. ll t=1;
  26. for(int j=0;j<mid;j++,t=t*w%mod) {
  27. ll u=a[i+j],v=a[i+j+mid]*t%mod;
  28. a[i+j]=(u+v)%mod;
  29. a[i+j+mid]=(u-v+mod)%mod;
  30. }
  31. }
  32. }
  33. if(flag==-1) {
  34. ll inv=ksm(n,mod-2);
  35. for(int i=0;i<n;i++) a[i]=a[i]*inv%mod;
  36. }
  37. }
  38. ll A[N<<2],B[N<<2];
  39. ll H[N];
  40. ll fac[N<<2],ifac[N<<2];
  41. ll C(int n,int m) {return fac[n]*ifac[m]%mod*ifac[n-m]%mod;}
  42. ll down[N];
  43. ll CC(int n,int m) {
  44. if(!m) return 1;
  45. return down[m]*ifac[m]%mod;
  46. }
  47. int main() {
  48. n=Get(),m=Get(),x=Get();
  49. for(int i=0;i<=m;i++) f[i]=Get();
  50. fac[0]=1;
  51. for(int i=1;i<=m;i++) fac[i]=fac[i-1]*i%mod;
  52. ifac[m]=ksm(fac[m],mod-2);
  53. for(int i=m-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
  54. int d=ceil(log2(2*m+1));
  55. ll flag=1;
  56. for(int i=0;i<=m;i++,flag=flag*(mod-1)%mod) A[i]=flag*ifac[i]%mod;
  57. for(int i=0;i<=m;i++) B[i]=f[i]*ifac[i]%mod;
  58. NTT(A,d,1),NTT(B,d,1);
  59. for(int i=0;i<1<<d;i++) A[i]=A[i]*B[i]%mod;
  60. NTT(A,d,-1);
  61. for(int i=0;i<=m;i++) H[i]=A[i]*fac[i]%mod;
  62. ll ans=0;
  63. down[1]=n;
  64. for(int i=2;i<=m;i++) down[i]=down[i-1]*(n-i+1)%mod;
  65. for(int i=0;i<=m;i++) (ans+=H[i]*ksm(x,i)%mod*CC(n,i))%=mod;
  66. cout<<ans;
  67. return 0;
  68. }

UOJ #269. 【清华集训2016】如何优雅地求和的更多相关文章

  1. [清华集训2016]如何优雅地求和——NTT

    题目链接: [清华集训2016]如何优雅地求和 题目大意:给出一个多项式$m+1$个点值$a_{0},a_{1}...a_{m}$(其中$f(i)=a_{i}$),并给出两个数$n,x$,求$Q(f, ...

  2. 洛谷 P6667 - [清华集训2016] 如何优雅地求和(下降幂多项式,多项式)

    题面传送门 wjz:<如何优雅地 AK NOI> 我:如何优雅地爆零 首先,按照这题总结出来的一个小套路,看到多项式与组合数结合的题,可以考虑将普通多项式转为下降幂多项式,因为下降幂和组合 ...

  3. UOJ269 清华集训2016 如何优雅地求和 下降幂多项式、NTT

    代码 神仙题? 看到连续的点值,那么一定是要利用到连续点值的性质,可以考虑下降幂多项式,即考虑多项式\(F(x) = \sum\limits_{i=0}^m a_ix^{\underline i}\) ...

  4. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  5. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

  6. [UOJ#276][清华集训2016]汽水[分数规划+点分治]

    题意 给定一棵 \(n\) 个点的树,给定 \(k\) ,求 \(|\frac{\sum w(路径长度)}{t(路径边数)}-k|\)的最小值. \(n\leq 5\times 10^5,k\leq ...

  7. UOJ 275. 【清华集训2016】组合数问题

    UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...

  8. [UOJ#276]【清华集训2016】汽水

    [UOJ#276][清华集训2016]汽水 试题描述 牛牛来到了一个盛产汽水的国度旅行. 这个国度的地图上有 \(n\) 个城市,这些城市之间用 \(n−1\) 条道路连接,任意两个城市之间,都存在一 ...

  9. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]

    #274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...

随机推荐

  1. psql 关于主键自增的问题

    在psql中往往我们需要设置一个自增的主键id字段,psql中不像SQL Server那样点选 打钩傻瓜式就能设置好的,是需要创建序列的:CREATE SEQUENCE,关键字SEQUENCE. 我们 ...

  2. @Autowired注解警告Field injection is not recommended

    在使用spring框架中的依赖注入注解@Autowired时,idea报了一个警告 大部分被警告的代码都是不严谨的地方,所以我深入了解了一下. 被警告的代码如下: @Autowired UserDao ...

  3. vue2.0 日历日程表 ,可进行二次开发.

    由于工作业务需求,要写一个日程表,日程表写之前 要先生成日历,废话不多说,直接 上代码: <!DOCTYPE html> <html lang="zh-CN"&g ...

  4. C#类型(一)

    1.System.Object C#的所有类型都是派生自System.Object 也就是说下面的两个类型定义完全一致 // 隐式派生自Object public class Person{ } { ...

  5. Hadoop系列008-HDFS的数据流

    本人微信公众号,欢迎扫码关注! HDFS的数据流 1 HDFS写数据流程 1.1 剖析文件写入 1)客户端向namenode请求上传文件,namenode检查目标文件是否已存在,父目录是否存在. 2) ...

  6. 从壹开始微服务 [ DDD ] 之六 ║聚合 与 聚合根 (下)

    前言 哈喽大家周二好,上次咱们说到了实体与值对象的简单知识,相信大家也是稍微有些了解,其实实体咱们平时用的很多了,基本可以和数据库表进行联系,只不过值对象可能不是很熟悉,值对象简单来说就是在DDD领域 ...

  7. 网络协议 21 - RPC 协议(中)- 基于 JSON 的 RESTful 接口协议

        上一节我们了解了基于 XML 的 SOAP 协议,SOAP 的 S 是啥意思来着?是 Simple,但是好像一点儿都不简单啊! 传输协议问题     对于 SOAP 来讲,比如我创建一个订单, ...

  8. ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

    一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自 ...

  9. 是时候给大家介绍 Spring Boot/Cloud 背后豪华的研发团队了。

    看了 Pivotal 公司的发展历史,这尼玛就是一场商业大片呀. 我们刚开始学习 Spring Boot 的时候肯定都会看到这么一句话: Spring Boot 是由 Pivotal 团队提供的全新框 ...

  10. SLAM+语音机器人DIY系列:(二)ROS入门——3.在ubuntu16.04中安装ROS kinetic

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...