[清华集训2016]如何优雅地求和——NTT
题目链接:
题目大意:给出一个多项式$m+1$个点值$a_{0},a_{1}...a_{m}$(其中$f(i)=a_{i}$),并给出两个数$n,x$,求$Q(f,n,x)=\sum\limits_{k=0}^{n}f(k)C_{n}^{k}x^k(1-x)^{n-k}mod998244353$的值。
当$f(x)=1$时,$Q=\sum\limits_{i=0}^{n}C_{n}^{i}k^i(1-k)^{n-i}$,根据二项式定理可知这个式子结果为$1$。
当$f(x)=x$时,$Q=\sum\limits_{i=0}^{n}i\frac{n!}{i!(n-i)!}k^i(1-k)^{n-i}$
$Q=\sum\limits_{i=0}^{n}nk\frac{(n-1)!}{(i-1)!(n-i)!}k^{i-1}(1-k)^{n-i}$
$Q=nk\sum\limits_{i=0}^{n}\frac{(n-1)!}{(i-1)!(n-i)!}k^{i-1}(1-k)^{n-i}$
$Q=nk\sum\limits_{i=0}^{n}C_{n-1}^{i-1}k^{i-1}(1-k)^{n-i}$
根据二项式定理可知,$Q=nk$。
进一步可以发现当$f(x)=x^{\underline{d}}$时,$Q=n^{\underline{d}}k^{d}$。其中$x^{\underline{d}}$表示$x$的$d$次下降幂即$x(x-1)(x-2)...(x-d+1)$,也就是$\frac{x!}{(x-d)!}$。推导过程和上面类似。
$Q=\sum\limits_{i=0}^{n}i^{\underline{d}}\frac{n!}{i!(n-i)!}k^i(1-k)^{n-i}$
$Q=\sum\limits_{i=0}^{n}\frac{i!}{(i-d)!}\frac{n!}{i!(n-i)!}k^{i}(1-k)^{n-i}$
$Q=\sum\limits_{i=0}^{n}n^{\underline{d}}k^{d}\frac{(n-d)!}{(i-d)!(n-i)!}k^{i-d}(1-k)^{n-i}$
$Q=n^{\underline{d}}k^{d}\sum\limits_{i=0}^{n}C_{n-d}^{i-d}k^{i-d}(1-k)^{n-i}$
根据二项式定理,后面那个还等于$1$,所以$Q=n^{\underline{d}}k^{d}$。
因为$x^{\underline{i}}$的最高次幂是$x^i$,所以一个$m$次多项式可以写成$f(x)=\sum\limits_{i=0}^{m}a_{i}x^{\underline{i}}$。那么
$Q(f,n,x)=\sum\limits_{i=0}^{m}a_{i}*Q(x^{\underline{i}},n,k)=\sum\limits_{i=0}^{m}a_{i}*n^{\underline{i}}k^i$
现在考虑如何求$a_{i}$,设$a_{i}=\frac{b_{i}}{i!}$,那么$f(x)=\sum\limits_{i=0}^{m}b_{i}\frac{x^{\underline{i}}}{i!}=\sum\limits_{i=0}^{m}b_{i}C_{x}^{i}$
因为我们知道当$x=0,1,2...m$时$f(x)$的值,所以
当$x=0$时,$f(x)=b_{0}$
我们设$\Delta f(x)=f(x+1)-f(x)$(即一阶差分)。
因为$C_{x+1}^{i}-C_{x}^{i}=C_{x}^{i-1}$,所以$\Delta f(x)=\sum\limits_{i=0}^{m}b_{i}C_{x}^{i-1}$。
那么$\Delta f(0)=b_{1}$,由此可以推出$\Delta^{k}f(0)=b_{k}$(即$k$阶差分)。
至此可以得到一个$O(m^2)$的暴力差分做法(实际上是能$AC$的)。
但我们展开$k$阶差分的第一项(即$\Delta^{k}f(0)$)表达式可以发现:
$b_{k}=\sum\limits_{i=0}^{k}(-1)^{k-i}C_{k}^{i}f(i)$
$b_{k}=\sum\limits_{i=0}^{k}(-1)^{k-i}\frac{k!}{i!(k-i)!}f(i)$
$\frac{b_{k}}{k!}=a_{k}=\sum\limits_{i=0}^{k}\frac{(-1)^{k-i}}{(k-i)!}*\frac{f(i)}{i!}$
我们设$F(i)=\frac{f(i)}{i!},G(i)=\frac{(-1)^i}{i!},A(i)=a_{i}$
那么$A(i)=F(i)*G(i)$用$FFT$或$NTT$多项式乘法一下即可将时间复杂度降到$O(mlog_{m})$。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define mod 998244353
using namespace std;
int n,k,m;
ll ans;
ll res;
int a[80010];
int b[80010];
int inv[80010];
int len;
ll quick(ll x,int y)
{
ll res=1ll;
while(y)
{
if(y&1)
{
res=res*x%mod;
}
y>>=1;
x=x*x%mod;
}
return res;
}
void NTT(int *a,int len,int miku)
{
for(int k=0,i=0;i<len;i++)
{
if(i>k)
{
swap(a[i],a[k]);
}
for(int j=len>>1;(k^=j)<j;j>>=1);
}
for(int k=2;k<=len;k<<=1)
{
int t=k>>1;
int x=quick(3,(mod-1)/k);
if(miku==-1)
{
x=quick(x,mod-2);
}
for(int i=0;i<len;i+=k)
{
int w=1;
for(int j=i;j<i+t;j++)
{
int tmp=1ll*a[j+t]*w%mod;
a[j+t]=(a[j]-tmp+mod)%mod;
a[j]=(a[j]+tmp)%mod;
w=1ll*w*x%mod;
}
}
}
if(miku==-1)
{
for(int i=0,t=quick(len,mod-2);i<len;i++)
{
a[i]=1ll*a[i]*t%mod;
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<=m;i++)
{
scanf("%d",&a[i]);
}
len=1;
while(len<=(m<<1))
{
len<<=1;
}
inv[0]=inv[1]=1;
for(int i=2;i<=m;i++)
{
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
}
for(int i=1;i<=m;i++)
{
inv[i]=1ll*inv[i]*inv[i-1]%mod;
}
for(int i=0;i<=m;i++)
{
a[i]=1ll*a[i]*inv[i]%mod;
b[i]=(i&1)?mod-inv[i]:inv[i];
}
NTT(a,len,1);
NTT(b,len,1);
for(int i=0;i<len;i++)
{
a[i]=1ll*a[i]*b[i]%mod;
}
NTT(a,len,-1);
res=1ll;
for(int i=0;i<=m;i++)
{
ans=(ans+res*a[i])%mod;
res=res*k%mod*(n-i)%mod;
}
printf("%lld",ans);
}
[清华集训2016]如何优雅地求和——NTT的更多相关文章
- UOJ269 清华集训2016 如何优雅地求和 下降幂多项式、NTT
代码 神仙题? 看到连续的点值,那么一定是要利用到连续点值的性质,可以考虑下降幂多项式,即考虑多项式\(F(x) = \sum\limits_{i=0}^m a_ix^{\underline i}\) ...
- 洛谷 P6667 - [清华集训2016] 如何优雅地求和(下降幂多项式,多项式)
题面传送门 wjz:<如何优雅地 AK NOI> 我:如何优雅地爆零 首先,按照这题总结出来的一个小套路,看到多项式与组合数结合的题,可以考虑将普通多项式转为下降幂多项式,因为下降幂和组合 ...
- UOJ #269. 【清华集训2016】如何优雅地求和
UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- UOJ_274_[清华集训2016]温暖会指引我们前行_LCT
UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
- UOJ 275. 【清华集训2016】组合数问题
UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...
- 【UOJ274】【清华集训2016】温暖会指引我们前行 LCT
[UOJ274][清华集训2016]温暖会指引我们前行 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很 ...
- [UOJ#276]【清华集训2016】汽水
[UOJ#276][清华集训2016]汽水 试题描述 牛牛来到了一个盛产汽水的国度旅行. 这个国度的地图上有 \(n\) 个城市,这些城市之间用 \(n−1\) 条道路连接,任意两个城市之间,都存在一 ...
- [UOJ#274][清华集训2016]温暖会指引我们前行
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
随机推荐
- 如果你的评论被WordPress的Akismet插件屏蔽,怎么解封?
Akismet是Matt Mullenweg早期创办的一个项目,现在已经是Automattic公司的一个专注于剿杀垃圾评论的产品.在Wordpress用户中使用最多,z-blog也有用户在用,由于垃圾 ...
- WPF 遍历资源字典中的控件
object obItem=this.FindResource("canvasdt"); if (obItem is System.Windows.DataTemplate) { ...
- MVC4学习要点记四
一.使用原生SQL使用EF的一个优点就是自动帮我们生成SQL,这在常规情况下很方便,但有些情况下用EF却不适合.另外还有些特别复杂的语句,利用EF很难生成.所以,EF提供一组方法用来执行原生的SQL. ...
- 数据库SQL优化分析查询语句总结
方法一: SELECT TOP 10 TEXT AS 'SQL Statement' ,last_execution_time AS 'Last Execution Time' ,(total_log ...
- 你不知道的css各类布局(四)之响应式布局
响应式布局 概念 响应式布局指的是同一页面在不同屏幕尺寸下有不同的布局 布局特点 响应式设计的目标是确保一个页面在所有终端上(各种尺寸的PC.手机.手表.冰箱的Web浏览器等等)都能显示出令人满意的效 ...
- Java学习 面向对象(下)——Java疯狂讲义th4
面向对象(下) [TOC] 包装类 通过包装类可以把8个基本类型的值包装成对象使用. 自动拆箱.自动装箱 把字符串类型值转换成基本类型的值: 包装类的 parseXxx(String s)静态方法 包 ...
- docker之常见错误
1. docker run -d --name showdoc -p 4999:80 -v /showdoc_data/html:/var/www/html/ star7th/showdoc WARN ...
- golang 环境变量讲解
以下配置以MAC 下配置为例,但其他环境下大同小异. GOROOT就是go的安装路径在~/.bash_profile中添加下面语句: GOROOT=/usr/local/go export GOROO ...
- Python中GUI库PyQt5的安装和配置
在使用Tkinter开发GUI程序时,发现相关文档比较少,开发起来太累.经过综合比较,决定使用PyQt这个库.下面是简单的安装步骤. 1.安装 PyQt5 : pip install PyQt5 -i ...
- ubuntu更改apt源为阿里云源
https://blog.csdn.net/zhangjiahao14/article/details/80554616 https://yq.aliyun.com/articles/704603 h ...