【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\)了,或者这个东西推一下生成函数也可以直接多项式求逆。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. #define MOD 998244353
  6. #define MAX 300300
  7. inline int read()
  8. {
  9. int x=0;bool t=false;char ch=getchar();
  10. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  11. if(ch=='-')t=true,ch=getchar();
  12. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  13. return t?-x:x;
  14. }
  15. 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;}
  16. int W[MAX],r[MAX];
  17. void NTT(int *P,int len,int opt)
  18. {
  19. int l=0,N;for(N=1;N<len;N<<=1)++l;
  20. for(int i=0;i<N;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
  21. for(int i=0;i<N;++i)if(i>r[i])swap(P[i],P[r[i]]);
  22. for(int i=1;i<N;i<<=1)
  23. {
  24. int w=fpow(3,(MOD-1)/(i<<1));
  25. W[0]=1;for(int k=1;k<i;++k)W[k]=1ll*W[k-1]*w%MOD;
  26. for(int j=0,p=i<<1;j<N;j+=p)
  27. for(int k=0;k<i;++k)
  28. {
  29. int X=P[j+k],Y=1ll*P[i+j+k]*W[k]%MOD;
  30. P[j+k]=(X+Y)%MOD;P[i+j+k]=(X+MOD-Y)%MOD;
  31. }
  32. }
  33. if(opt==-1)
  34. {
  35. reverse(&P[1],&P[N]);
  36. for(int i=0,inv=fpow(N,MOD-2);i<N;++i)P[i]=1ll*P[i]*inv%MOD;
  37. }
  38. }
  39. int n,a[MAX],R,val,ans;
  40. int A[MAX],B[MAX],f[MAX];
  41. int jc[MAX],jv[MAX],inv[MAX];
  42. void CDQ(int l,int r)
  43. {
  44. if(l==r)
  45. {
  46. if(l==0)f[l]=1ll*val*fpow(R,MOD-2)%MOD;
  47. f[l]=1ll*f[l]*jc[l]%MOD;
  48. return;
  49. }
  50. int mid=(l+r)>>1;
  51. CDQ(l,mid);
  52. for(int i=l;i<=mid;++i)A[i-l]=1ll*f[i]*jv[i]%MOD;
  53. for(int i=1;i<=r-l+1;++i)B[i]=1ll*val*jv[i]%MOD;
  54. int len=r-l+1+mid-l+1,N;for(N=1;N<=len;)N<<=1;
  55. NTT(A,N,1);NTT(B,N,1);
  56. for(int i=0;i<N;++i)A[i]=1ll*A[i]*B[i]%MOD;
  57. NTT(A,N,-1);
  58. for(int i=mid+1;i<=r;++i)f[i]=(f[i]+A[i-l])%MOD;
  59. for(int i=0;i<N;++i)A[i]=B[i]=0;
  60. CDQ(mid+1,r);
  61. }
  62. int main()
  63. {
  64. n=read();R=read();val=1ll*R*fpow((1+MOD-R)%MOD,MOD-2)%MOD;
  65. for(int i=0;i<=n;++i)a[i]=read();
  66. jc[0]=jv[0]=inv[0]=inv[1]=1;
  67. for(int i=2;i<=n;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
  68. for(int i=1;i<=n;++i)jc[i]=1ll*jc[i-1]*i%MOD;
  69. for(int i=1;i<=n;++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;
  70. CDQ(0,n);
  71. for(int i=0;i<=n;++i)ans=(ans+1ll*a[i]*f[i])%MOD;
  72. printf("%d\n",ans);
  73. return 0;
  74. }

【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. vue父子组件的通信

    一.父组件向子组件传递数据 1.首先形成父子组件关系 <!DOCTYPE html> <html lang="en"> <head> <m ...

  2. 13 个 NPM 快速开发技巧

    摘要: 玩转npm. 作者:前端小智 原文:13 个 npm 快速开发技巧 Fundebug经授权转载,版权归原作者所有. 为了保证的可读性,本文采用意译而非直译. 每天,数以百万计的开发人员使用 n ...

  3. 错误记录PHP preg_match(): Compilation failed: range out of order in character class at offset 7 01_login.php</b> on line <b>13</b><br />

    <?php //响应头格式为json,编码为uft-8,注意有- header("Content-Type:application/json;charset=utf-8"); ...

  4. bat脚本里面if else if的写法

    曾经困扰了很久的bat脚本,如果里面包含多种条件判断,就必须要试用if,else if,else的写法了.尝试了很久,终于找到规律: 第一种写法:最简单,就是写一行. @echo off rem 写一 ...

  5. linux 的 expect 自动交互

    https://www.jianshu.com/p/0194cbd70d39 https://www.cnblogs.com/saneri/p/10819348.html  参考 expect是一个自 ...

  6. true false

    #include<stdio.h> int main(void) { /* true 1 false 0 */ printf( == ); printf( > ); printf( ...

  7. linux open 黄色文件

    表示设备文件 生成的新的pdf

  8. LiunxCentos7 上安装 FastDFS

    Centos7 上安装 FastDFS 1.安装gcc(编译时需要) FastDFS是C语言开发,安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gc ...

  9. NOIP 2002 过河卒

    洛谷P1002 https://www.luogu.org/problemnew/show/P1002 JDOJ 1290 https://neooj.com/oldoj/problem.php?id ...

  10. spring框架的定时任务cronExpression表达式详解

    附:cronExpression表达式解释: 0 0 12 * * ?---------------在每天中午12:00触发 0 15 10 ? * *---------------每天上午10:15 ...