洛谷 P6667 - [清华集训2016] 如何优雅地求和(下降幂多项式,多项式)
wjz:《如何优雅地 AK NOI》
我:如何优雅地爆零
首先,按照这题总结出来的一个小套路,看到多项式与组合数结合的题,可以考虑将普通多项式转为下降幂多项式,因为下降幂和组合数都可以用阶乘相除的形式表示,而对于两个组合数相乘我们有恒等式 \(\dbinom{n}{m}\dbinom{m}{k}=\dbinom{n}{k}\dbinom{n-k}{m-k}\),这样我们可以将原式中待枚举变量 \(m\) 从两个组合数中转移到一个组合数(\(\dbinom{n-k}{m-k}\))中,也就进而可以用二项式定理等公式化简了。
因此此题我们也可以考虑设 \(f(x)=\sum\limits_{i=0}^mb_ix^{\underline{i}}\),下面开始推式子:
ans&=\sum\limits_{k=0}^mf(k)\dbinom{n}{k}x^k(1-x)^{n-k}\\
&=\sum\limits_{k=0}^n\sum\limits_{j=0}^mb_jk^{\underline{j}}\dbinom{n}{k}x^k(1-x)^{n-k}\\
&=\sum\limits_{j=0}^mb_jj!\sum\limits_{k=j}^n\dbinom{k}{j}\dbinom{n}{k}x^k(1-x)^{n-k}\\
&=\sum\limits_{j=0}^mb_jj!\dbinom{n}{j}\sum\limits_{k=j}^n\dbinom{n-j}{k-j}x^k(1-x)^{n-k}\\
&=\sum\limits_{j=0}^mb_jj!\dbinom{n}{j}\sum\limits_{k=0}^{n-j}\dbinom{n-j}{k}x^{k+j}(1-x)^{n-k-j}\\
&=\sum\limits_{j=0}^mb_jj!\dbinom{n}{j}x^j(1-x+x)^{n-j}\\
&=\sum\limits_{j=0}^mb_jj!\dbinom{n}{j}x^j
\end{aligned}
\]
因此我们只需求出 \(b_j\) 即可在线性的时间内计算出 \(ans\)。
接下来我们的任务是怎样由 \(f(x)\) 的点值计算出 \(b_i\),考虑 \(f(x)\) 的 \(\text{EGF}\),那么有
\sum\limits_{n}\dfrac{f(n)x^n}{n!}&=\sum\limits_{n}\sum\limits_{j=0}^mb_jn^{\underline{j}}\dfrac{x^n}{n!}\\
&=\sum\limits_{j=0}^mb_j\sum\limits_{n}\dfrac{x^n}{(n-j)!}\\
&=\sum\limits_{j=0}^mb_jx^j\sum\limits_{n}\dfrac{x^{n-j}}{(n-j)!}
\end{aligned}
\]
记 \(A=\sum\limits_{j=0}^mb_jx^j,B=\sum\limits_{j}\dfrac{x^j}{j!}=e^x\),那么 \(\sum\limits_{n}\dfrac{f(n)x^n}{n!}=A\times B\)。
故 \(A=(\sum\limits_{n}\dfrac{f(n)x^n}{n!})\times e^{-x}\),NTT 一下即可。
时间复杂度 \(n\log n\)。
const int pr=3;
const int MOD=998244353;
const int ipr=(MOD+1)/3;
const int MAXP=1<<16;
int qpow(int x,int e){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int rev[MAXP+5];
void NTT(vector<int> &a,int len,int type){
int lg=31-__builtin_clz(len);
for(int i=0;i<len;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<lg-1);
for(int i=0;i<len;i++) if((i-rev[i])>>31) swap(a[i],a[rev[i]]);
for(int i=2;i<=len;i<<=1){
int W=qpow((type<0)?ipr:pr,(MOD-1)/i);
for(int j=0;j<len;j+=i){
for(int k=0,w=1;k<(i>>1);k++,w=1ll*w*W%MOD){
int X=a[j+k],Y=1ll*w*a[(i>>1)+j+k]%MOD;
a[j+k]=(X+Y)%MOD;a[(i>>1)+j+k]=(X-Y+MOD)%MOD;
}
}
} if(!~type) for(int j=0,ivn=qpow(len,MOD-2);j<len;j++) a[j]=1ll*a[j]*ivn%MOD;
}
vector<int> conv(vector<int> a,vector<int> b){
int LEN=1;while(LEN<a.size()+b.size()) LEN<<=1;a.resize(LEN,0);b.resize(LEN,0);
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);return a;
}
int n,m,x,fac[MAXP+5],ifac[MAXP+5];
void init_fac(int n){
for(int i=(fac[0]=ifac[0]=ifac[1]=1)+1;i<=n;i++) ifac[i]=1ll*ifac[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%MOD,ifac[i]=1ll*ifac[i]*ifac[i-1]%MOD;
}
int main(){
scanf("%d%d%d",&n,&m,&x);vector<int> a(m+1),b(m+1);init_fac(m);
for(int i=0;i<=m;i++) scanf("%d",&a[i]),a[i]=1ll*a[i]*ifac[i]%MOD;
for(int i=0;i<=m;i++) b[i]=((~i&1)?ifac[i]:(MOD-ifac[i]));a=conv(a,b);
int ans=0,cur=1;for(int i=0;i<=m;i++) ans=(ans+1ll*a[i]*cur%MOD*qpow(x,i))%MOD,cur=1ll*cur*(n-i)%MOD;
printf("%d\n",ans);
return 0;
}
洛谷 P6667 - [清华集训2016] 如何优雅地求和(下降幂多项式,多项式)的更多相关文章
- UOJ269 清华集训2016 如何优雅地求和 下降幂多项式、NTT
代码 神仙题? 看到连续的点值,那么一定是要利用到连续点值的性质,可以考虑下降幂多项式,即考虑多项式\(F(x) = \sum\limits_{i=0}^m a_ix^{\underline i}\) ...
- [清华集训2016]如何优雅地求和——NTT
题目链接: [清华集训2016]如何优雅地求和 题目大意:给出一个多项式$m+1$个点值$a_{0},a_{1}...a_{m}$(其中$f(i)=a_{i}$),并给出两个数$n,x$,求$Q(f, ...
- 洛谷 P6672 - [清华集训2016] 你的生命已如风中残烛(组合数学)
洛谷题面传送门 题解里一堆密密麻麻的 Raney 引理--蒟蒻表示看不懂,因此决定写一篇题解提供一个像我这样的蒟蒻能理解的思路,或者说,理解方式. 首先我们考虑什么样的牌堆顺序符合条件.显然,在摸牌任 ...
- 洛谷 P2260 [清华集训2012]模积和 || bzoj2956
https://www.lydsy.com/JudgeOnline/problem.php?id=2956 https://www.luogu.org/problemnew/show/P2260 暴力 ...
- 洛谷P2260 [清华集训2012]模积和(容斥+数论分块)
题意 https://www.luogu.com.cn/problem/P2260 思路 具体思路见下图: 注意这个模数不是质数,不能用快速幂来求逆元,要用扩展gcd. 代码 #include< ...
- 洛谷 P4002 - [清华集训2017]生成树计数(多项式)
题面传送门 神题. 考虑将所有连通块缩成一个点,那么所有连好边的生成树在缩点之后一定是一个 \(n\) 个点的生成树.我们记 \(d_i\) 为第 \(i\) 个连通块缩完点之后的度数 \(-1\), ...
- 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 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
随机推荐
- 【UE4 C++】碰撞检测与事件绑定
概念 碰撞对象通道与预设 默认提供碰撞对象类型,如 WorldStatic.WorldDynamic等.允许用户自定义 默认提供碰撞预设,如 NoCollision.BloackAll.Overlap ...
- [技术博客]使用pylint实现django项目的代码风格检查
使用pylint实现django项目的代码风格检查 前言 一个项目大多都是由一个团队来完成,如果没有统一的代码规范,那么每个人的代码的风格必定会有很大的差别.且不说会存在多个人同时开发同一模块的情 ...
- zip和flatMap没有生效
在Reactor 中flatMap和zip等没有生效 1.一个简单的示例代码如下: 2.示例运行结果 3.得到结论 最近在项目中使用了 Project Reactor ,但发现代码在写着写着有些地方没 ...
- Linux C语言链表你学会了吗?
链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用.链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节 ...
- 攻防世界 杂项 7.Aesop_secret
打开发现是个gif,以为有个二维码扫一下就给flag,结果被欺骗.呜呜呜 好了,还是使用编辑器看一下吧 发现了好玩的,U2FsdGVkX19QwGkcgD0fTjZxgijRzQOGbCWALh4sR ...
- 小白自制Linux开发板 十. NES游戏玩起来
本篇基于我们制作的Debian文件系统而展开,而且我们这会玩一些高级的操作方式--用我们的小电脑进行程序编译. 所以本篇操作全部都在我们个的开发板上完成. 1. 开发环境搭建 首先安装gcc, ...
- 求1+2+3...+n 牛客网 剑指Offer
求1+2+3...+n 牛客网 剑指Offer 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). ...
- Bzoj P2054 疯狂的馒头 | 并查集
题目链接 思路:因为每次染色都会将某些馒头的颜色彻底更改,所以每个馒头的最终的颜色其实是由最后一次染色决定的,那么我们只考虑最后一次染色即可.对此,我们可以从后往前倒着染色,当目前的染色区间中存在白色 ...
- 第06课 OpenGL 纹理映射
纹理映射: 在这一课里,我将教会你如何把纹理映射到立方体的六个面. 学习 texture map 纹理映射(贴图)有很多好处.比方说您想让一颗导弹飞过屏幕.根据前几课的知识,我们最可行的办法可能是很多 ...
- 【.NET 与树莓派】用 MPD 制作数字音乐播放器
树莓派的日常家居玩法多多,制作一台属于自己的数字音乐播放机是其中的一种.严格上说,树莓派是没有声卡的,其板载的 3.5 mm 音频孔实际是通过 PWM 来实现音频输出的(通过算法让PWM信号变成模拟信 ...