Codeforces 题目传送门 & 洛谷题目传送门

神仙题 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

首先考虑最朴素的 \(dp\),设 \(dp_{z,i}\) 表示经过 \(z\) 次操作后剩下的数为 \(i\) 的概率,那么显然有 \(dp\) 转移方程 \(dp_{z,i}=\sum\limits_{j\ge i}dp_{z-1,j}·\dfrac{1}{j+1}\)。

边界条件 \(dp_{0,i}=p_i\)

直接递推显然不行,考虑优化,我们记 \(F_z(x)=\sum\limits_{i=0}^ndp_{z,i}x^i\),我们不妨来探究一下 \(F_z(x)\) 有哪些性质:

\[\begin{aligned}
F_z(x)&=\sum\limits_{i=0}^ndp_{z,i}x^i\\
&=\sum\limits_{i=0}^n\sum\limits_{j\ge i}dp_{z-1,j}\dfrac{1}{j+1}x^i\\
&=\sum\limits_{j=0}^ndp_{z-1,j}\dfrac{1}{j+1}\sum\limits_{i=0}^jx^i\\
&=\sum\limits_{j=0}^ndp_{z-1,j}\dfrac{1}{j+1}\dfrac{x^{j+1}-1}{x-1}\\
&=\dfrac{1}{x-1}\sum\limits_{j=0}^ndp_{z-1,j}\dfrac{x^{j+1}-1}{j+1}
\end{aligned}
\]

注意到

\[\dfrac{x^{j+1}}{j+1}=\int_0^xk^j\,\mathrm dk,\dfrac{1}{j+1}=\int_0^1k^j\,\mathrm dk
\]

因此

\[\dfrac{x^{j+1}-1}{j+1}=\int_1^xk^j\,\mathrm dk
\]

代入得

\[\begin{aligned}
&\dfrac{1}{x-1}\sum\limits_{j=0}^ndp_{z-1,j}\dfrac{x^{j+1}-1}{j+1}\\
=&\dfrac{1}{x-1}\sum\limits_{j=0}^ndp_{z-1,j}\int_1^xk^j\,\mathrm dk\\
=&\dfrac{1}{x-1}\int_1^x\sum\limits_{j=0}^ndp_{z-1,j}k^j\,\mathrm dk\\
=&\dfrac{1}{x-1}\int_1^xF_{z-1}(k)\,\mathrm dk
\end{aligned}
\]

注意到这边积分下界是 \(1\),并且左边还多出了个恶心的 \(\dfrac{1}{x-1}\),非常棘手,因此考虑将这个 \(\dfrac{1}{x-1}\) 去掉,于是考虑设 \(G_z(x)=F_z(x+1)\),那么:

\[\begin{aligned}
G_z(x)&=F_z(x+1)\\
&=\dfrac{1}{x}\int_1^{x+1}F_{z-1}(k)\,\mathrm dk\\
&=\dfrac{1}{x}\int_0^{x}F_{z-1}(k+1)\,\mathrm dk\\
&=\dfrac{1}{x}\int_0^{x}G_{z-1}(k)\,\mathrm dk\\
\end{aligned}
\]

噫!好!这下下界变成 \(0\) 了,左边也没有讨厌的 \(\dfrac{1}{x-1}\) 了!

接下来考虑设 \(G_z(x)=\sum\limits_{i=0}^ng_{z,i}x^i\),那么根据 \(G_z(x)=\dfrac{1}{x}\int_0^xG_{z-1}(k)\,\mathrm dk\) 有

\[G_z(x)=\dfrac{1}{x}\int_0^xG_{z-1}(k)\,\mathrm dk=\dfrac{1}{x}\sum\limits_{i=1}^{n+1}\dfrac{g_{z-1,i-1}}{i}x^i=\sum\limits_{i=0}^{n}\dfrac{g_{z-1,i}}{i+1}x^i
\]

因此 \(g_{z,i}=\dfrac{g_{z-1,i}}{i+1}\)。

这玩意儿显然可以快速幂加速,即 \(g_{m,i}=\dfrac{g_{0,i}}{(i+1)^m}\)。

也就是说接下来我们只需实现 \(F_0(x)\to G_0(x),G_m(x)\to F_m(x)\) 即可。

注意到

\[\begin{aligned}
F_0(x+1)&=\sum\limits_{i=0}^np_i(x+1)^i\\
&=\sum\limits_{i=0}^np_i\sum\limits_{j=0}^i\dbinom{i}{j}x^j\\
&=\sum\limits_{j=0}^i(\sum\limits_{i=j}^n\dbinom{i}{j}p_i)x^j
\end{aligned}
\]

\[g_{0,i}=\sum\limits_{j=i}^n\dbinom{j}{i}p_j
\]

拆组合数可得 \(g_{0,i}=\sum\limits_{j=i}^n\dfrac{j!}{i!(j-i)!}p_j=\dfrac{1}{i!}\sum\limits_{j=i}^nj!p_j·\dfrac{1}{(j-i)!}\),按照 NTT 求差卷积的套路来即可。

\(G_m(x)\to F_m(x)\) 也同理,类似地有

\[g_{m,i}=\sum\limits_{j=i}^n\dbinom{j}{i}f_{m,j}
\]

二项式反演一下可得

\[f_{m,i}=\sum\limits_{j=i}^n\dbinom{j}{i}(-1)^{j-i}g_{m,j}
\]

和上面一样 NTT 求遍差卷积即可。

时间复杂度 \(n\log n\)。

const int MAXN=1e5;
const int MAXP=1<<18;
const int MOD=998244353;
const int pr=3;
const int ipr=(MOD+1)/3;
int n,f[MAXN+5],g[MAXN+5],h[MAXN+5];ll m;
int fac[MAXN+5],ifac[MAXN+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-1]*ifac[i]%MOD;
}
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]) 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*a[(i>>1)+j+k]*w%MOD;
a[j+k]=(X+Y)%MOD;a[(i>>1)+j+k]=(X-Y+MOD)%MOD;
}
}
}
if(type==-1){
int ivn=qpow(len,MOD-2);
for(int i=0;i<len;i++) a[i]=1ll*a[i]*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 main(){
scanf("%d%lld",&n,&m);m%=(MOD-1);init_fac(n);
for(int i=0;i<=n;i++) scanf("%d",&f[i]);
vector<int> A(n+1),B(n+1);
for(int i=0;i<=n;i++) A[i]=ifac[i],B[n-i]=1ll*fac[i]*f[i]%MOD;
vector<int> C=conv(A,B);
for(int i=0;i<=n;i++){
g[i]=1ll*ifac[i]*C[n-i]%MOD;
g[i]=1ll*g[i]*qpow(qpow(i+1,MOD-2),m)%MOD;
} iota(A.begin(),A.end(),0);iota(B.begin(),B.end(),0);
for(int i=0;i<=n;i++){
if(~i&1) A[i]=ifac[i];else A[i]=MOD-ifac[i];
B[n-i]=1ll*fac[i]*g[i]%MOD;
} C=conv(A,B);
for(int i=0;i<=n;i++) printf("%d ",1ll*C[n-i]*ifac[i]%MOD);
return 0;
}

Codeforces 923E - Perpetual Subtraction(微积分+生成函数+推式子+二项式反演+NTT)的更多相关文章

  1. Codeforces 947E Perpetual Subtraction (线性代数、矩阵对角化、DP)

    手动博客搬家: 本文发表于20181212 09:37:21, 原地址https://blog.csdn.net/suncongbo/article/details/84962727 呜啊怎么又是数学 ...

  2. Codeforces 1528F - AmShZ Farm(转化+NTT+推式子+第二类斯特林数)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题,只不过感觉有点强行二合一(?). 首先考虑什么样的数组 \(a\) 符合条件,我们考虑一个贪心的思想,我们从前到后遍历,对于每一个 ...

  3. Codeforces 917D - Stranger Trees(矩阵树定理/推式子+组合意义)

    Codeforces 题目传送门 & 洛谷题目传送门 刚好看到 wjz 在做这题,心想这题之前好像省选前做过,当时觉得是道挺不错的题,为啥没写题解呢?于是就过来补了,由此可见我真是个大鸽子(( ...

  4. 【CF932E】Perpetual Subtraction(NTT,线性代数)

    [CF932E]Perpetual Subtraction(NTT,线性代数) 题面 洛谷 CF 题解 设\(f_{i,j}\)表示\(i\)轮之后这个数恰好为\(j\)的概率. 得到转移:\(\di ...

  5. BZOJ 3453 - tyvj 1858 XLkxc(插值+推式子)

    题面传送门 首先根据我们刚学插值时学的理论知识,\(f(i)\) 是关于 \(i\) 的 \(k+1\) 次多项式.而 \(g(x)\) 是 \(f(x)\) 的前缀和,根据有限微积分那一套理论,\( ...

  6. bzoj 3157 && bzoj 3516 国王奇遇记——推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3157 https://www.lydsy.com/JudgeOnline/problem.p ...

  7. [HAOI2007]分割矩阵 DP+推式子

    发现最近好少写博客啊(其实是各种摆去了) 更一点吧 这道题要求最小化均方差,其实凭直觉来说就是要使每个块分的比较均匀一点,但是单单想到想到这些还是不够的, 首先f[i][j][k][l][t]表示以( ...

  8. P3768 简单的数学题 杜教筛+推式子

    \(\color{#0066ff}{ 题目描述 }\) 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数n和一个整数p,你需要求出(\(\sum_{i=1}^n\sum_{j=1}^n ij ...

  9. bzoj 3157 & bzoj 3516 国王奇遇记 —— 推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3157 https://www.lydsy.com/JudgeOnline/problem.p ...

随机推荐

  1. CentOS 压缩解压

    目录 命令 tar gzip.gunzip bzip2.bunzip2 zip.unzip 命令组合 打包:将多个文件合成一个总的文件,这个总的文件通常称为"归档". 压缩:将一个 ...

  2. 《JavaScript DOM编程艺术》:+= 相加之后再赋值

    第2章  第20页 += var year = 2010; var message = "The year is"; message += year; message += yea ...

  3. [Beta]the Agiles Scrum Meeting 4

    会议时间:2020.5.15 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 yjy 增加教学计划面板,修复bug tq 实现查看.删除测试点功能 wjx 实现批量创建结对项目功能 ...

  4. BUAA软件工程结对项目作业

    BUAA软件工程结对项目 小组成员:16005001,17373192 1.教学班级和项目地址 项目 内容 这个作业属于哪个课程 博客园班级连接 这个作业的要求在哪里 结对项目作业 我在这个课程的目标 ...

  5. OO助教工作总结

    ​ \(OO\)助教的工作结束了,在这一学期中,我主要负责对作业进行测试,对指导书进行检查,讨论区管理,部分数据构造,以及完成随班助教的工作. 测试 指导书检查 ​ 每次指导书公开前我都会先把指导书看 ...

  6. Sharding-JDBC自定义复合分片算法

    Sharding-JDBC自定义复合分片算法 一.背景 二.需求 1.对于客户端操作而言 2.对于运营端操作而言 三.分片算法 1.客户id和订单id的生成规则 2. 确定数据落在那个表中 3.举例说 ...

  7. 修改git仓库的远程地址

    在我们开发的过程中,代码一般是由 git 来管理的,但有些时候我们的 git 仓库的地址可能发生了变换,比如我们使用的 gitLab 地址发生了变化,那么这个时候如何来将原项目的 git 地址进行修改 ...

  8. eureka服务端和客户端的简单搭建

    本篇博客简单记录一下,eureka 服务端和 客户端的简单搭建. 目标: 1.完成单机 eureka server 和 eureka client 的搭建. 2.完成eureka server 的添加 ...

  9. [HNOI2009]双递增序列(洛谷P4728)+小烈送菜(内部训练题)——奇妙的dp

    博主学习本题的经过嘤嘤嘤: 7.22 : 听学长讲(一知半解)--自己推(推不出来)--网上看题解--以为自己会了(网上题解是错的)--发现错误以后又自己推(没推出来)--给学长发邮件--得到正确解法 ...

  10. VMware Workstation 16.2 Pro for Linux SLIC 2.6 & Unlocker

    请访问原文链接:https://sysin.org/blog/vmware-workstation-16-linux-slic/,查看最新版.原创作品,转载请保留出处. 作者:gc(at)sysin. ...