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. 【SQL】BETWEEN操作符

    BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围. 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围.这些值可以是数值.文本或者日期. 注意: ...

  2. C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)

    不得不说FFMPEG真是个神奇的玩意,所接触的部分不过万一.网上有个很火的例子是c++方面的,当然这个功能还是用c++来实现比较妥当. 然而我不会c++ 因为我的功能需求比较简单,只要实现基本的录制就 ...

  3. 【技术累积】【点】【Java】【12】几种常见编码(持续更新)

    问题描述 有这么一段代码: String question = new String(record.getQuestion().getBytes("iso-8859-1"), &q ...

  4. ui界面设计

    UI即User Interface(用户界面)的简称,指对软件的人机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅是让软件变得有个性有品位,还要让软件的操作变得舒适简单.自由,充分体现软件的定位 ...

  5. 【sqli-labs】 less4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)

    提交id参数 加' http://localhost/sqli/Less-4/?id=1' 页面正常,添加" http://localhost/sqli/Less-4/?id=1" ...

  6. windows 下安装mysql 成功版

    mysql 下载地址 http://dev.mysql.com/downloads/ zip版下载 解压到本地 假设文件保存在C:\mysql-5.7.17-winx64 1.以管理员身份运行cmd. ...

  7. Python标准模块--logging(转载)

    转载地址:http://www.cnblogs.com/zhbzz2007/p/5943685.html#undefined Python标准模块--logging 1 logging模块简介 log ...

  8. Spring实战(中文4,5版) PDF含源码

    Spring实战 读者评价 看了一半后在做评论,物流速度挺快,正版行货,只是运输过程有点印记,但是想必大家和你关注内容,spring 4必之3更加关注的是使用注解做开发,对于初学者还是很有用,但是不排 ...

  9. 博弈论题目总结(二)——SG组合游戏及变形

    SG函数 为了更一般化博弈问题,我们引入SG函数 SG函数有如下性质: 1.如果某个状态SG函数值为0,则它后继的每个状态SG函数值都不为0 2.如果某个状态SG函数值不为0,则它至少存在一个后继的状 ...

  10. 将项目上传到Github之使用git命令上传

    1,先从GitHub网页上建立一个数据仓库 2,安装git 下载地址:https://www.git-scm.com/download/win 3,找到本地要上传的项目目录,右键点击Git Bash ...