题目链接

(BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4734

(UOJ) http://uoj.ac/problem/269

题解

似乎大家都是用神仙构造的做法构造了一个二项式反演,然而我只会拿Stirling数爆推QAQ……

首先考虑\(f(x)=x^m\)的情况,最后乘上一个系数求和即可。

\[\sum^n_{k=0}{n\choose k}k^mx^k(1-x)^{n-k}\\ =\sum^n_{k=0}\sum^m_{i=0}\begin{Bmatrix}m\\i\end{Bmatrix}k^{\underline i}x^k(1-x)^{n-k}\\ =\sum^m_{i=0}\begin{Bmatrix}m\\i\end{Bmatrix}\sum^n_{k=0}\frac{n!}{(n-k)!(k-i)!}x^k(1-x)^{n-k}\\ =\sum^m_{i=0}\begin{Bmatrix}m\\i\end{Bmatrix}n^{\underline i}\sum^n_{k=0}{n-i\choose k-i}x^k(1-x)^{n-k}\\ =\sum^m_{i=0}\begin{Bmatrix}m\\i\end{Bmatrix}n^{\underline i}x^i
\]

设\(f(x)=\sum^m_{i=0}a_ix^i\), 则答案为\(\sum^m_{i=0}a_i\sum^i_{j=0}\begin{Bmatrix}i\\j\end{Bmatrix}n^{\underline j}x^j\)

嗯,直接求的话时间复杂度是\(O(m^2)\). 而这个做法看上去很难优化了,因为里面用到了斯特林数而且两维都不固定,怎么办?

斯特林数阻止了进一步的优化,因此刚才我们把幂转成了斯特林数,现在再考虑把斯特林数转回来!

首先要注意到一点就是斯特林数的基本公式\(\begin{Bmatrix}i\\j\end{Bmatrix}=\frac{1}{j!}\sum^j_{k=0}(-1)^{j-k}{j\choose k}k^i\)当\(i<j\)时也是适用的,此时等式两边都为\(0\).

于是有

\[\sum^m_{i=0}a_i\sum^i_{j=0}\begin{Bmatrix}i\\j\end{Bmatrix}n^{\underline j}x^j\\ =\sum^m_{i=0}a_i\sum^i_{j=0}\sum^j_{k=0}(-1)^{j-k}{j\choose k}k^i{n\choose j}x^j\\ =\sum^m_{j=0}{n\choose j}x^j\sum^j_{k=0}(-1)^{j-k}{j\choose k}\sum^m_{k=0}a_ik^i\\=\sum^m_{j=0}{n\choose j}x^j\sum^j_{k=0}(-1)^{j-k}{j\choose k}f(k)
\]

而题目里给定的恰好是\(f(x)\)在\(x=0,1,...,m\)处的点值!所以其实根本不需要插值!

推到这里做法就很显然了: 用NTT对每个\(j\)求出\(g_j=\sum^m_{j=0}(-1)^{j-k}{j\choose k}f(k)\), 然后计算\(\sum^m_{j=0}{n\choose j}x^jg_j\)即可。

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

代码

#include<bits/stdc++.h>
#define llong long long
using namespace std; inline int read()
{
int w=1,s=0;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)) {s=s*10+ch-'0';ch=getchar();}
return w*s;
} const int N = 1<<17;
const int lgN = 17;
const int P = 998244353;
const int G = 3; llong quickpow(llong x,llong y)
{
llong cur = x,ret = 1ll;
for(int i=0; y; i++)
{
if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}
cur = cur*cur%P;
}
return ret;
}
llong mulinv(llong x) {return quickpow(x,P-2);} namespace FFT
{
llong aux1[N+3],aux2[N+3],aux3[N+3],aux4[N+3],aux5[N+3];
int fftid[N+3];
llong sexp[N+3];
void resize(int dgr1,int dgr2,llong poly[]) {if(dgr1>dgr2) swap(dgr1,dgr2); for(int i=dgr1; i<dgr2; i++) poly[i] = 0ll;}
int getdgr(int n) {int dgr = 1; while(dgr<=n) dgr<<=1; return dgr;}
void init_fftid(int dgr)
{
int len = 0; for(int i=1; i<=lgN; i++) {if(dgr==(1<<i)) {len = i; break;}}
fftid[0] = 0; for(int i=1; i<dgr; i++) fftid[i] = (fftid[i>>1]>>1)|((i&1)<<(len-1));
}
void ntt(int dgr,int coe,llong poly[],llong ret[])
{
init_fftid(dgr);
if(poly==ret) {for(int i=0; i<dgr; i++) {if(i<fftid[i]) swap(ret[i],ret[fftid[i]]);}}
else {for(int i=0; i<dgr; i++) ret[i] = poly[fftid[i]];}
for(int i=1; i<dgr; i<<=1)
{
llong tmp = quickpow(G,(P-1)/(i<<1)); if(coe==-1) tmp = mulinv(tmp);
sexp[0] = 1ll; for(int j=1; j<i; j++) sexp[j] = sexp[j-1]*tmp%P;
for(int j=0; j<dgr; j+=(i<<1))
{
for(llong *k=ret+j,*kk=sexp; k<ret+i+j; k++,kk++)
{
llong x = (*k),y = k[i]*(*kk)%P;
(*k) = x+y>=P?x+y-P:x+y; k[i] = x-y<0?x-y+P:x-y;
}
}
}
if(coe==-1) {llong tmp = mulinv(dgr); for(int i=0; i<dgr; i++) ret[i] = ret[i]*tmp%P;}
}
void polymul(int dgr,llong poly1[],llong poly2[],llong ret[])
{
ntt(dgr<<1,1,poly1,aux1); ntt(dgr<<1,1,poly2,aux2);
for(int i=0; i<(dgr<<1); i++) ret[i] = aux1[i]*aux2[i]%P;
ntt(dgr<<1,-1,ret,ret);
}
}
using FFT::getdgr;
using FFT::resize;
using FFT::ntt;
using FFT::polymul; llong fact[N+3],finv[N+3];
llong f[N+3],g[N+3],h[N+3];
int m; llong n,ax; int main()
{
fact[0] = 1ll; for(int i=1; i<=N; i++) fact[i] = fact[i-1]*i%P;
finv[N] = quickpow(fact[N],P-2); for(int i=N-1; i>=0; i--) finv[i] = finv[i+1]*(i+1)%P;
scanf("%lld%d%lld",&n,&m,&ax); int dgr = getdgr(m);
for(int i=0; i<=m; i++) scanf("%lld",&f[i]),f[i] = f[i]*finv[i]%P;
for(int i=0; i<=dgr; i++) g[i] = i&1?P-finv[i]:finv[i];
polymul(dgr,f,g,h);
for(int i=0; i<=m; i++) h[i] = h[i]*fact[i]%P;
llong cur1 = 1ll,cur2 = 1ll,ans = 0ll;
for(int i=0; i<=m&&i<=n; i++)
{
llong tmp = cur1*cur2%P*h[i]%P;
ans = (ans+tmp)%P;
cur1 = cur1*mulinv(i+1ll)%P*(n-i)%P; cur2 = cur2*ax%P;
}
printf("%lld\n",ans);
return 0;
}

BZOJ 4734 UOJ #269 如何优雅地求和 (多项式)的更多相关文章

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

    UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...

  2. [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字

    [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...

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

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

  4. uoj#269. 【清华集训2016】如何优雅地求和(数论)

    传送门 首先,如果\(f(x)=1\),那么根据二项式定理,有\(Q(f,n,k)=1\) 当\(f(x)=x\)的时候,有\[Q=\sum_{i=0}^ni\times \frac{n!}{i!(n ...

  5. BZOJ 4945 UOJ #317 NOI2017 游戏 2-SAT 拓扑排序

    http://uoj.ac/problem/317 https://www.lydsy.com/JudgeOnline/problem.php?id=4945 我现在的程序uoj的额外数据通过不了,b ...

  6. 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓

    题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...

  7. BZOJ 3218 UOJ #77 A+B Problem (主席树、最小割)

    大名鼎鼎的A+B Problem, 主席树优化最小割-- 调题死活调不对,一怒之下改了一种写法交上去A了,但是改写法之后第4,5个点常数变大很多,于是喜提UOJ全站倒数第三 目前还不知道原来的写法为什 ...

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

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

  9. 【BZOJ 4555】[Tjoi2016&Heoi2016]求和 多项式求逆/NTT+第二类斯特林数

    出处0.0用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O(n ...

随机推荐

  1. VBA精彩代码分享-4

    VBA设置/取消工作簿共享是很常用的一个功能,那么如何用代码实现呢? 设置共享 Then MsgBox "文件没有保存" Exit Sub End If Application.D ...

  2. Django入门第一步:构建一个简单的Django项目

    Django入门第一步:构建一个简单的Django项目 1.简介 Django是一个功能完备的Python Web框架,可用于构建复杂的Web应用程序.在本文中,将通过示例跳入并学习Django.您将 ...

  3. 监控神器-普罗米修斯Prometheus的安装

    搬砖党的福音:普罗米修斯-监控神器 功能: 在业务层用作埋点系统 Prometheus支持多种语言(Go,java,python,ruby官方提供客户端,其他语言有第三方开源客户端).我们可以通过客户 ...

  4. KVM之配置桥接网卡

    配置桥接网卡 添加桥接网卡br0,注释掉已有的eth0配置 [root@ubuntu01 ~]# vi /etc/network/interfaces # This file describes th ...

  5. flask小结

    http通讯过程 https://www.cnblogs.com/andy9468/p/10871079.html 1.flask开发环境 https://www.cnblogs.com/andy94 ...

  6. 安装habse

    1.下载zookeeper-3.4.5.tar.gz, hbase-0.98.6-hadoop2-bin.tar.gz 2.上传到master的 /usr/local/src/目录下,解压zookee ...

  7. 怎么读取properties文件和ini文件?

    一.读取properties文件: properties中的内容: server.ip = 127.0.0.1 server.port = 22 //原生java即可读取public static v ...

  8. [Mac][Python][Virtualenv]安装配置和使用

    安装帮助文档安装VirtualEnv报错如下 tekiMacBook-Air:workspaces hbai$ source /usr/local/bin/virtualenvwrapper.sh / ...

  9. jajx 传参 需要 判断的 条件

    1.有没有权限. 2.数据类型 对不对 例如 id ,page  传过来时是str 类型, view中处理时需要转换成 int类型. 如果 不能转 就会报错.. 3.查询数据.数据不存在也要报错... ...

  10. SpringBoot LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

    SpringBoot 在启动项目的时候一起错误: SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in ...