UOJ #269. 【清华集训2016】如何优雅地求和
UOJ #269. 【清华集训2016】如何优雅地求和
给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\)。
然后求:
\]
考虑一个很巧妙的变化:组合数多项式!
设:
\]
可以这么玩的原因是\(\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\)了。
\Rightarrow h_n=\sum_{i=0}^n (-1)^{n-i}\binom{n}{i}f_i
\]
写成卷积形式:
\]
再来算答案。
考虑对\(f\)的每一项计算:
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}
\]
我们知道:
\]
所以:
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}
\]
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 20005
using namespace std;
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;}
const ll mod=998244353;
ll ksm(ll t,ll x) {
	ll ans=1;
	for(;x;x>>=1,t=t*t%mod)
		if(x&1) ans=ans*t%mod;
	return ans;
}
int n,m,x;
ll f[N];
void NTT(ll *a,int d,int flag) {
	static int rev[N<<2];
	static ll G=3;
	int n=1<<d;
	for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<d-1);
	for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
	for(int s=1;s<=d;s++) {
		int len=1<<s,mid=len>>1;
		ll w=flag==1?ksm(G,(mod-1)/len):ksm(G,mod-1-(mod-1)/len);
		for(int i=0;i<n;i+=len) {
			ll t=1;
			for(int j=0;j<mid;j++,t=t*w%mod) {
				ll u=a[i+j],v=a[i+j+mid]*t%mod;
				a[i+j]=(u+v)%mod;
				a[i+j+mid]=(u-v+mod)%mod;
			}
		}
	}
	if(flag==-1) {
		ll inv=ksm(n,mod-2);
		for(int i=0;i<n;i++) a[i]=a[i]*inv%mod;
	}
}
ll A[N<<2],B[N<<2];
ll H[N];
ll fac[N<<2],ifac[N<<2];
ll C(int n,int m) {return fac[n]*ifac[m]%mod*ifac[n-m]%mod;}
ll down[N];
ll CC(int n,int m) {
	if(!m) return 1;
	return down[m]*ifac[m]%mod;
}
int main() {
	n=Get(),m=Get(),x=Get();
	for(int i=0;i<=m;i++) f[i]=Get();
	fac[0]=1;
	for(int i=1;i<=m;i++) fac[i]=fac[i-1]*i%mod;
	ifac[m]=ksm(fac[m],mod-2);
	for(int i=m-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
	int d=ceil(log2(2*m+1));
	ll flag=1;
	for(int i=0;i<=m;i++,flag=flag*(mod-1)%mod) A[i]=flag*ifac[i]%mod;
	for(int i=0;i<=m;i++) B[i]=f[i]*ifac[i]%mod;
	NTT(A,d,1),NTT(B,d,1);
	for(int i=0;i<1<<d;i++) A[i]=A[i]*B[i]%mod;
	NTT(A,d,-1);
	for(int i=0;i<=m;i++) H[i]=A[i]*fac[i]%mod;
	ll ans=0;
	down[1]=n;
	for(int i=2;i<=m;i++) down[i]=down[i-1]*(n-i+1)%mod;
	for(int i=0;i<=m;i++) (ans+=H[i]*ksm(x,i)%mod*CC(n,i))%=mod;
	cout<<ans;
	return 0;
}
												
											UOJ #269. 【清华集训2016】如何优雅地求和的更多相关文章
- [清华集训2016]如何优雅地求和——NTT
		
题目链接: [清华集训2016]如何优雅地求和 题目大意:给出一个多项式$m+1$个点值$a_{0},a_{1}...a_{m}$(其中$f(i)=a_{i}$),并给出两个数$n,x$,求$Q(f, ...
 - 洛谷 P6667 - [清华集训2016] 如何优雅地求和(下降幂多项式,多项式)
		
题面传送门 wjz:<如何优雅地 AK NOI> 我:如何优雅地爆零 首先,按照这题总结出来的一个小套路,看到多项式与组合数结合的题,可以考虑将普通多项式转为下降幂多项式,因为下降幂和组合 ...
 - UOJ269 清华集训2016 如何优雅地求和 下降幂多项式、NTT
		
代码 神仙题? 看到连续的点值,那么一定是要利用到连续点值的性质,可以考虑下降幂多项式,即考虑多项式\(F(x) = \sum\limits_{i=0}^m a_ix^{\underline i}\) ...
 - [UOJ#274][清华集训2016]温暖会指引我们前行
		
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
 - BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)
		
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...
 - [UOJ#276][清华集训2016]汽水[分数规划+点分治]
		
题意 给定一棵 \(n\) 个点的树,给定 \(k\) ,求 \(|\frac{\sum w(路径长度)}{t(路径边数)}-k|\)的最小值. \(n\leq 5\times 10^5,k\leq ...
 - UOJ 275. 【清华集训2016】组合数问题
		
UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...
 - [UOJ#276]【清华集训2016】汽水
		
[UOJ#276][清华集训2016]汽水 试题描述 牛牛来到了一个盛产汽水的国度旅行. 这个国度的地图上有 \(n\) 个城市,这些城市之间用 \(n−1\) 条道路连接,任意两个城市之间,都存在一 ...
 - UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
		
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
 
随机推荐
- ReactiveSwift源码解析(三) Signal代码的基本实现
			
上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...
 - 【死磕 Spring】----- IOC 之解析 bean 标签:开启解析进程
			
原文出自:http://cmsblogs.com import 标签解析完毕了,再看 Spring 中最复杂也是最重要的标签 bean 标签的解析过程. 在方法 parseDefaultElement ...
 - JAVA Web实时消息后台服务器推送技术---GoEasy
			
---恢复内容开始--- 越来越多的项目需要用到实时消息的推送与接收,我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 ...
 - 当 “HTTP” 先生遇上“S”小姐
			
情人节的晚上,天空中淅淅沥沥的下着带有些寒意的小雨.HTTP 先生孤零零的坐在咖啡厅中,对着面前的电脑发呆.他有意的屏蔽掉了周边情侣们的窃窃私语,这对单身的他来说是狗粮,也是一阵阵伤害.这时,咖啡厅的 ...
 - docker 搭建私有仓库 harbor
			
前提 已安装好 docker 和 docker-compose 环境:CentOS Linux release 7.5 docker 版本:18.09.05 1.安装harbor wget -P / ...
 - Nginx安装与代理
			
1.第一步 - 添加Nginx存储库 要添加CentOS 7 EPEL存储库,请打开终端并使用以下命令: sudo yum install epel-release 2.第二步 - 安装Nginx 现 ...
 - BeetleX之HttpClusterApi应用详解
			
之前的文章已经介绍过如何使用HttpClusterApi进行去中心化的HTTP集群服务访问,这一章主要详细讲述如何使用HttpClusterApi,主要包括如何定义节点,创建服务接口和使用接口描述不同 ...
 - 为什么要抛弃Pact?如何快速实现契约测试(CDC)
			
前言 在前几天的博客中,我转载了一篇文章,其中介绍了契约测试和pact是怎么实施的,的确很有帮助.但我经过研究,其实是pact本身也是有缺陷的,结合我近期在使用的服务型工具和我的实际情况,觉得实现契约 ...
 - [SpringBoot guides系列翻译]调用RESTfulWebService
			
原文 参考链接 CommandLineRunner Bean 翻译如何调用RESTful WebService 这节将演示如何在SpringBoot里面调用RESTful的WebService. 构建 ...
 - Springboot 系列(十三)使用邮件服务
			
在我们这个时代,邮件服务不管是对于工作上的交流,还是平时的各种邮件通知,都是一个十分重要的存在.Java 从很早时候就可以通过 Java mail 支持邮件服务.Spring 更是对 Java mai ...