interlinkage:

https://www.luogu.org/problemnew/show/P5349

description:

solution:

设$g(x)=\sum_{n=0}^{∞}n^xr^n$

$rg(x)=\sum_{n=0}^{∞}n^xr^{n+1}=\sum_{n=1}^{∞}(n-1)^xr^n$

$g(x)=\sum_{n=1}^{∞}n^xr^n(x>0)$(注意$x>0$这个条件,$x=0$的时候这个不符合)

$(1-r)g(x)=\sum_{n=1}^{∞}(n^x-(n-1)^x)r^n=r\sum_{n=0}^{∞}r^n((n+1)^x-n^x)=r\sum_{n=0}^{∞}r^n\sum_{j=0}^{x-1}\dbinom{x}{j}n^j$

$=r\sum_{j=0}^{x-1}\dbinom{x}{j}\sum_{n=0}^{∞}n^jr^n=r\sum_{j=0}^{x-1}\dbinom{x}{j}g(j)$

于是$g(x)=\frac{r}{1-r}\sum_{j=0}^{x-1}\dbinom{x}{j}g(j)$

继续化简得到$\frac{g(x)}{x!}=\sum_{j=0}^{x-1}\frac{g(j)}{j!}(\frac{r}{1-r}*\frac{1}{(x-j)!})$

这个显然可以用分治$FFT$来做

值得注意的是$g(0)=\frac{1}{1-r}$,而不是$\frac{r}{1-r}$,因为在这里$0^0$的值实际上是算$1$的

直接分治的话复杂度为$O(nlognlogn)$,多项式求逆时间复杂度为$O(nlogn)$

code:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll; const int N=4e5+;
const ll mo=;
int m;
ll r;
ll a[N],wn[N],R[N],fac[N],inv[N];
inline ll read()
{
char ch=getchar();ll s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
ll qpow(ll a,ll b)
{
ll re=;
for (;b;b>>=,a=a*a%mo) if (b&) re=re*a%mo;
return re;
}
void pre()
{
for (int i=;i<=;i++)
{
ll t=1ll<<i;
wn[i]=qpow(,(mo-)/t);
}
}
void ntt(int limit,ll *a,int type)
{
for (int i=;i<limit;i++) if (i<R[i]) swap(a[i],a[R[i]]);
for (int len=,id=;len<limit;len<<=)
{
++id;
for (int k=;k<limit;k+=(len<<))
{
ll w=;
for (int l=;l<len;l++,w=w*wn[id]%mo)
{
ll Nx=a[k+l],Ny=w*a[k+len+l]%mo;
a[k+l]=(Nx+Ny)%mo;
a[k+len+l]=((Nx-Ny)%mo+mo)%mo;
}
}
}
if (type==) return;
for (int i=;i<limit/;i++) swap(a[i],a[limit-i]);
ll inv=qpow(limit,mo-);
for (int i=;i<limit;i++) a[i]=a[i]%mo*inv%mo;
}
ll A[N],B[N];
void cdqfft(ll *a,ll *b,int l,int r)
{
if (l==r) return;
int mid=l+r>>;
cdqfft(a,b,l,mid); int limit=,L=;
while (limit<=(r-l+)*) limit<<=,++L;
for (int i=;i<=limit;i++) R[i]=(R[i>>]>>)|((i&)<<(L-)); for (int j=;j<=limit;j++) A[j]=,B[j]=;
for (int j=l;j<=mid;j++) A[j-l]=a[j];
for (int j=;j<=r-l;j++) B[j]=b[j];
ntt(limit,A,);ntt(limit,B,);
for (int i=;i<=limit;i++) A[i]=A[i]*B[i]%mo;
ntt(limit,A,-);
for (int x=mid+;x<=r;x++) a[x]=(a[x]+A[x-l])%mo;
cdqfft(a,b,mid+,r);
}
ll g[N],f[N];
int main()
{
pre();
m=read();r=read();
for (int i=;i<=m;i++) a[i]=read();
fac[]=inv[]=;
for (int i=;i<=m;i++) fac[i]=fac[i-]*i%mo;
inv[m]=qpow(fac[m],mo-);
for (int i=m-;i>=;i--) inv[i]=inv[i+]*(i+)%mo;
f[]=qpow(-r+mo,mo-)%mo;
for (int i=;i<=m;i++) g[i]=inv[i]*f[]%mo*r%mo;
cdqfft(f,g,,m);
ll ans=;
for (int i=;i<=m;i++) ans=(ans+a[i]*f[i]%mo*fac[i]%mo)%mo;
printf("%lld\n",ans);
return ;
}

[luogu P5349] 幂 解题报告 (分治FFT)的更多相关文章

  1. 【九度OJ】题目1474:矩阵幂 解题报告

    [九度OJ]题目1474:矩阵幂 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1474 题目描述: 给定一个n*n的矩阵,求该矩阵的 ...

  2. [题解] Luogu P4721 【模板】分治 FFT

    分治FFT的板子为什么要求逆呢 传送门 这个想法有点\(cdq\)啊,就是考虑分治,在算一段区间的时候,我们把他分成两个一样的区间,然后先做左区间的,算完过后把左区间和\(g\)卷积一下,这样就可以算 ...

  3. [jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)

    题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 注: ...

  4. Luogu 4721 【模板】分治 FFT

    还不会这题的多项式求逆的算法. 发现每一项都是一个卷积的形式,那么我们可以使用$NTT$来加速,直接做是$O(n^2logn)$的,我们考虑如何加速转移. 可以采用$cdq$分治的思想,对于区间$[l ...

  5. Luogu P5349 幂

    大力数学题,发现自己好久没写多项式水平急速下降,求逆都要写挂233 首先看到关于多项式的等比数列求和,我们容易想到先求出每一项的系数然后最后累加起来即可,即设\(f_i=\sum_{n=0}^{\in ...

  6. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)

    题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...

  7. [luogu P3360] 偷天换日 解题报告(树形DP)

    题目链接:https://www.luogu.org/problemnew/show/P3360 题解: 首先我们把边上的消耗放到向下的点上,如果是叶子节点的话就先做一次0/1背包 发现这是一颗二叉树 ...

  8. [luogu P2586] GCD 解题报告 (莫比乌斯反演|欧拉函数)

    题目链接:https://www.luogu.org/problemnew/show/P2568#sub 题目大意: 计算​$\sum_{x=1}^n\sum_{y=1}^n [gcd(x,y)==p ...

  9. BZOJ1008 /乘法原理+快速幂 解题报告

    1008: [HNOI2008]越狱 Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生 ...

随机推荐

  1. AndroidStudio怎样导入library项目库

    先打开一个Project,然后将libraryr的项目作为module进行导入: File菜单->import module菜单 以上只是导入进来,还没有作为与project真正有效的一部分.需 ...

  2. JAVA;使用java.awt.Image的不稳定性

    在使用awt的image时候,不是能时时获取到图像的宽和高, GetWidth()函数偶尔得到的值为-1,暂时没有找到解决方法. 代码: public class picture extends JF ...

  3. X.509 certificate

    A digital certificate is a collection of data used to securely distribute the public half of a publi ...

  4. html 底部虚线

    <div style="width: 100%; font-size: 14px; color: #666; border-bottom: 1px dashed #666;" ...

  5. brew 安装的.net 运行时提示"Did you mean to run dotnet SDK commands?"

    原因未知,但有解决方案 使用 brew cask 安装的.NET Core brew cask install dotnet 结果运行时出现: 解决方案: 下载官方 .pkg 文件安装,顺便卸载掉 b ...

  6. js中的数组遍历

    js中的数组遍历是项目中经常用到的,在这里将几种方法做个对比. ! for循环:使用评率最高,也是最基本的一种遍历方式. let arr = ['a','b','c','d','e']; for (l ...

  7. 浅谈 Mysql

    数据库一些基本的概念 Mysql 基础操作 Mysql 数据类型 Mysql 表的完整性约束 Mysql 表的操作 Mysql 数据增删改查语句 Mysql 多表查询 Mysql 索引原理及分类 My ...

  8. netsh wlan set hostednetwork 之后如何删除掉 配置 及终端无法获取IP的解决方法

    来源 微软 技术支持网站 仅仅禁用hostednetwork 是不行的,配置其实还在,彻底删除 配置可以按照如下操作进行: net stop wlansvcGet-ItemProperty " ...

  9. ACDream - Dynamic Inversions II

    先上题目: A - Dynamic Inversions II Time Limit: 6000/3000MS (Java/Others) Memory Limit: 128000/64000KB ( ...

  10. 【ACM】hdu_1862_EXCEL排序_201308091948

    EXCEL排序 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...