【Luogu5349】幂(分治FFT)

题面

洛谷

题解

把多项式每一项拆出来考虑,于是等价于要求的只有\(\sum_{i=0}^\infty i^kr^i\)。

令\(f(r)=\sum_{i=0}^\infty i^k r^i\),那么\(rf(r)=\sum_{i=0}^\infty r i^k r^i\)。

这里默认\(a^k=0\),\(k=0\)的时候特殊处理一下就行了。

然后就可以得到:

\[\begin{aligned}
(1-r)f_k(r)&=\sum_{i=0}^\infty i^kr^i-\sum_{i=0}^{\infty}i^kr^{i+1}\\
&=\sum_{i=1}^\infty i^kr^i-\sum_{i=1}^\infty (i-1)^k r^i\\
&=\sum_{i=1}^{\infty}r^i(i^k-(i-1)^k)\\
&=r\sum_{i=0}^\infty r^i ((i+1)^k-i^k)\\
&=r\sum_{i=1}^\infty r^i \sum_{j=0}^{k-1}i^j{k\choose j}\\
&=r\sum_{j=0}^{k-1}{k\choose j}\sum_{i=0}^{\infty}i^jr^i\\
&=r\sum_{j=0}^{k-1}{k\choose j}f_j(r)
\end{aligned}\]

然后我们就知道了\(f_k(r)=\frac{r}{1-r}\sum_{j=0}^{k-1}{k\choose j}f_j(r)\)。

然后稍微拆开一下:

\[\begin{aligned}
f_k(r)&=\frac{r}{1-r}\sum_{j=0}^{k-1}\frac{k!}{j!(k-j)!}f_j(r)\\
\frac{f_k(r)}{k!}&=\sum_{i=0}^{k-1}\frac{f_j(r)}{j!}\frac{r}{(k-j)!(1-r)}
\end{aligned}\]

然后就可以随意的分治\(FFT\)了,或者这个东西推一下生成函数也可以直接多项式求逆。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MOD 998244353
#define MAX 300300
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
int W[MAX],r[MAX];
void NTT(int *P,int len,int opt)
{
int l=0,N;for(N=1;N<len;N<<=1)++l;
for(int i=0;i<N;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
for(int i=0;i<N;++i)if(i>r[i])swap(P[i],P[r[i]]);
for(int i=1;i<N;i<<=1)
{
int w=fpow(3,(MOD-1)/(i<<1));
W[0]=1;for(int k=1;k<i;++k)W[k]=1ll*W[k-1]*w%MOD;
for(int j=0,p=i<<1;j<N;j+=p)
for(int k=0;k<i;++k)
{
int X=P[j+k],Y=1ll*P[i+j+k]*W[k]%MOD;
P[j+k]=(X+Y)%MOD;P[i+j+k]=(X+MOD-Y)%MOD;
}
}
if(opt==-1)
{
reverse(&P[1],&P[N]);
for(int i=0,inv=fpow(N,MOD-2);i<N;++i)P[i]=1ll*P[i]*inv%MOD;
}
}
int n,a[MAX],R,val,ans;
int A[MAX],B[MAX],f[MAX];
int jc[MAX],jv[MAX],inv[MAX];
void CDQ(int l,int r)
{
if(l==r)
{
if(l==0)f[l]=1ll*val*fpow(R,MOD-2)%MOD;
f[l]=1ll*f[l]*jc[l]%MOD;
return;
}
int mid=(l+r)>>1;
CDQ(l,mid);
for(int i=l;i<=mid;++i)A[i-l]=1ll*f[i]*jv[i]%MOD;
for(int i=1;i<=r-l+1;++i)B[i]=1ll*val*jv[i]%MOD;
int len=r-l+1+mid-l+1,N;for(N=1;N<=len;)N<<=1;
NTT(A,N,1);NTT(B,N,1);
for(int i=0;i<N;++i)A[i]=1ll*A[i]*B[i]%MOD;
NTT(A,N,-1);
for(int i=mid+1;i<=r;++i)f[i]=(f[i]+A[i-l])%MOD;
for(int i=0;i<N;++i)A[i]=B[i]=0;
CDQ(mid+1,r);
}
int main()
{
n=read();R=read();val=1ll*R*fpow((1+MOD-R)%MOD,MOD-2)%MOD;
for(int i=0;i<=n;++i)a[i]=read();
jc[0]=jv[0]=inv[0]=inv[1]=1;
for(int i=2;i<=n;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=n;++i)jc[i]=1ll*jc[i-1]*i%MOD;
for(int i=1;i<=n;++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;
CDQ(0,n);
for(int i=0;i<=n;++i)ans=(ans+1ll*a[i]*f[i])%MOD;
printf("%d\n",ans);
return 0;
}

【Luogu5349】幂(分治FFT)的更多相关文章

  1. [luogu P5349] 幂 解题报告 (分治FFT)

    interlinkage: https://www.luogu.org/problemnew/show/P5349 description: solution: 设$g(x)=\sum_{n=0}^{ ...

  2. 【模板】分治 FFT

    Link Solution 有两种解法. 法1: 直接上分治FFT,也就是CDQ分治+FFT. 具体做法是先递归左半边,算出左半边答案之后,将左半边贡献到右半边,然后递归右半边. 分治是一个log的, ...

  3. 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)

    再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...

  4. BNUOJ 51279[组队活动 Large](cdq分治+FFT)

    传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...

  5. hdu 5730 Shell Necklace [分治fft | 多项式求逆]

    hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...

  6. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  7. 分治FFT的三种含义

    分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\( ...

  8. 【XSY2666】排列问题 DP 容斥原理 分治FFT

    题目大意 有\(n\)种颜色的球,第\(i\)种有\(a_i\)个.设\(m=\sum a_i\).你要把这\(m\)个小球排成一排.有\(q\)个询问,每次给你一个\(x\),问你有多少种方案使得相 ...

  9. 【XSY2887】【GDOI2018】小学生图论题 分治FFT 多项式exp

    题目描述 在一个 \(n\) 个点的有向图中,编号从 \(1\) 到 \(n\),任意两个点之间都有且仅有一条有向边.现在已知一些单向的简单路径(路径上任意两点各不相同),例如 \(2\to 4\to ...

随机推荐

  1. html跳转,获取get提交参数

    html跳转到html页面,url后面携带参数,可以通过脚本获取到url?test=value地址后的参数. 1.more.html 携带参数跳转到list.html,get提交参数 2.list.h ...

  2. android studio学习----android studio断点调试

    先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试. IDE下方出现Debug视图,红色的箭头指 ...

  3. HBase常用的JAVA API操作

    为了方便以后查看,总结了一些常用的java操作hbase的代码: package com.mcq; import static org.hamcrest.CoreMatchers.describedA ...

  4. Centos 7 下yum搭建lnmp环境(yum安装方式)

    我们都知道linux下安装软件主要有三种方式: 1.源码编译安装,即下载软件源代码,利用gcc g++ make 等编译工具进行编译安装: 此方式的优点:可以指定软件版本,可选择性好:编译时可以手动指 ...

  5. 其他综合-CentOS 7 rsync+nginx实现公网yum源

    CentOS 7 rsync+nginx实现公网yum源 1.实验描述 镜像同步公网 yum 源上游 yum 源必须要支持 rsync 协议,否则不能使用 rsync 进行同步.CentOS 7.6 ...

  6. vs2017离线安装vs tools for unity

    Visual Studio Tools for Unity 从vs2017开始就不提供单独的安装包下载,需要通过vs安装程序在线安装. vs2017离线安装vs tools for unity 那么如 ...

  7. 201871010108-高文利《面向对象程序设计(java)》第十一周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...

  8. 201871010131-张兴盼 《面向对象程序设计(Java)》第十周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...

  9. 多线程(三)多线程同步_基本介绍及mutex互斥体

    同步进制的引入为了解决以下三个主要问题:1.控制多个线程之间对共享资源访问,保证共享资源的完整性例如:线程A对共享资源进行写入,线程B读取共享资源2.确保多个线程之间的动作以指定的次序发生例如:线程B ...

  10. 在 Oracle 中使用正则表达式

    Oracle使用正则表达式离不开这4个函数: 1.regexp_like 2.regexp_substr 3.regexp_instr 4.regexp_replace 看函数名称大概就能猜到有什么用 ...