【Luogu5349】幂(分治FFT)
【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\)的时候特殊处理一下就行了。
然后就可以得到:
(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)\)。
然后稍微拆开一下:
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)的更多相关文章
- [luogu P5349] 幂 解题报告 (分治FFT)
interlinkage: https://www.luogu.org/problemnew/show/P5349 description: solution: 设$g(x)=\sum_{n=0}^{ ...
- 【模板】分治 FFT
Link Solution 有两种解法. 法1: 直接上分治FFT,也就是CDQ分治+FFT. 具体做法是先递归左半边,算出左半边答案之后,将左半边贡献到右半边,然后递归右半边. 分治是一个log的, ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- BNUOJ 51279[组队活动 Large](cdq分治+FFT)
传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...
- hdu 5730 Shell Necklace [分治fft | 多项式求逆]
hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...
- 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是第二类斯特林 ...
- 分治FFT的三种含义
分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\( ...
- 【XSY2666】排列问题 DP 容斥原理 分治FFT
题目大意 有\(n\)种颜色的球,第\(i\)种有\(a_i\)个.设\(m=\sum a_i\).你要把这\(m\)个小球排成一排.有\(q\)个询问,每次给你一个\(x\),问你有多少种方案使得相 ...
- 【XSY2887】【GDOI2018】小学生图论题 分治FFT 多项式exp
题目描述 在一个 \(n\) 个点的有向图中,编号从 \(1\) 到 \(n\),任意两个点之间都有且仅有一条有向边.现在已知一些单向的简单路径(路径上任意两点各不相同),例如 \(2\to 4\to ...
随机推荐
- CTF必备技能丨Linux Pwn入门教程——ShellCode
这是一套Linux Pwn入门教程系列,作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的一些题目和文章整理出一份相对完整的Linux Pwn教程. 课程回顾>> Linu ...
- vue学习指南:第二篇(详细Vue基础) - Vue的指令
一. Vue 的介绍 1. vue是一个 mvvm 的框架.(面试官经常会问的),angular 是 mvc的框架. 2. vm 是 vum 的实例,这个实例存在计算机内存中,主要干两件大事: 1. ...
- 图解Java数据结构之单链表
本篇文章介绍数据结构中的单链表. 链表(Linked List)介绍 链表可分为三类: 单链表 双向链表 循环列表 下面具体分析三个链表的应用. 单链表 链表是有序的列表,它在内存中存储方式如下: 虽 ...
- vnc服务器和windows2012密钥
[root@localhost ~]# vncserver #启动服务器 windows 2012 64位-server版本的密钥 Windows Server 2012 Standard 密钥:NB ...
- 【Spring Boot】Spring Boot之使用ImportBeanDefinitionRegistrar类实现动态注册Bean
一.ImportBeanDefinitionRegistrar类介绍 ImportBeanDefinitionRegistrar类通过其他@Configuration类通过@Import的方式来加载, ...
- nodejs实现简单爬虫
nodejs结合cheerio实现简单爬虫 let cheerio = require("cheerio"), fs = require("fs"), util ...
- django-图形验证码(django-simple-captcha)
在网站开发的登录页面中,经常会需要使用到图形验证码来验证.在Django中,django-simple-captcha库包提供了图形验证码的使用. django-simple-captcha的安装 p ...
- Python 简易的异步协程使用方法
代码 import asyncio async def ex(id, n): print(id+" start") await asyncio.sleep(n/2) print(i ...
- super与this用法
super注意点: 1.当super调用父类的构造方法,必须在构造方法的第一个: 2.super必须只能出现在子类的方法或者构造方法中: 3.super和this不能同时调用构造方法: 4.super ...
- css,区别pc端ipad端的样式
摘自: http://blog.csdn.net/pm_mybook/article/details/54602107 /* 横屏 */ @media all and (orientation:lan ...