Luogu P5349 幂
大力数学题,发现自己好久没写多项式水平急速下降,求逆都要写挂233
首先看到关于多项式的等比数列求和,我们容易想到先求出每一项的系数然后最后累加起来即可,即设\(f_i=\sum_{n=0}^{\infty} n^kr^n\),那么最后\(ans=\sum_{i=0}^m a_if_i\)
然后你直接去OEIS就找到了它的生成函数,一波搞定233
好了我们认真开始推式子,\(f_i=\sum_{n=0}^{\infty} n^kr^n\)
\(r\cdot f_i=\sum_{n=1}^\infty (n-1)^kr^n\)
即\((1-r)f_i=\sum_{n=1}^\infty (n^k-(n-1)^k)r^n=r\cdot \sum_{n=0}^\infty ((n+1)^k-n^k)r^n\)
上式等于\(r\cdot \sum_{n=0}^\infty\sum_{j=0}^{i-1} C_i^j\cdot n^i r^n=r\cdot \sum_{j=0}^{i-1} C_i^j\cdot \sum_{n=0}^\infty n^i r^n=r\cdot\sum_{j=0}^{i-1} C_i^j\cdot f_j\)
即有\(f_i=\frac{r}{1-r}\cdot \sum_{j=0}^{i-1} C_i^j\cdot f_j\)
把组合数展开就有\(\frac{f_i}{i!}=\sum_{j=0}^{i-1} \frac{f_j}{j!}(\frac{r}{1-r}\cdot\frac{1}{(k-i)!})\)
看出来这是个分治NTT的形式,用类似于板子题的方法转化为多项式求逆解决
具体地,令\(F(x)=1-\frac{1}{i!}\cdot\frac{r}{1-r}\),对\(F(x)\)求逆得出\(G(x)\)再乘回\(i!\)即可求出\(f(x)\)
CODE
#include<cstdio>
#include<cctype>
#include<algorithm>
#define RI register int
#define CI const int&
#define Tp template <typename T>
using namespace std;
const int N=100005,mod=998244353;
int n,r,F[N<<3],G[N<<3],fact[N],inv[N],A[N],invr,mtir,ans;
class FileInputOutput
{
private:
static const int S=1<<21;
#define tc() (A==B&&(B=(A=Fin)+fread(Fin,1,S,stdin),A==B)?EOF:*A++)
char Fin[S],*A,*B;
public:
Tp inline void read(T& x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc()));
}
#undef tc
}File;
inline int sum(CI x,CI y)
{
int t=x+y; return t>=mod?t-mod:t;
}
inline int sub(CI x,CI y)
{
int t=x-y; return t<0?t+mod:t;
}
inline int quick_pow(int x,int p=mod-2,int mul=1)
{
for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
}
inline void init(CI n)
{
RI i; for (fact[0]=i=1;i<=n;++i) fact[i]=1LL*fact[i-1]*i%mod;
for (inv[n]=quick_pow(fact[n]),i=n-1;~i;--i) inv[i]=1LL*inv[i+1]*(i+1)%mod;
}
class Poly_Solver
{
private:
int rev[N<<3],T[N<<3],lim,p;
inline void init(CI n)
{
for (lim=1,p=0;lim<=(n<<1);lim<<=1,++p);
for (RI i=0;i<lim;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<p-1);
}
inline void swap(int& x,int& y)
{
int t=x; x=y; y=t;
}
inline void NTT(int *f,CI opt)
{
RI i; for (i=0;i<lim;++i) if (i<rev[i]) swap(f[i],f[rev[i]]);
for (i=1;i<lim;i<<=1)
{
int m=i<<1,D=quick_pow(3,~opt?(mod-1)/m:mod-1-(mod-1)/m);
for (RI j=0;j<lim;j+=m)
{
int W=1; for (RI k=0;k<i;++k,W=1LL*W*D%mod)
{
int x=f[j+k],y=1LL*f[i+j+k]*W%mod;
f[j+k]=sum(x,y); f[i+j+k]=sub(x,y);
}
}
}
if (!~opt)
{
int Inv=quick_pow(lim); for (i=0;i<lim;++i) f[i]=1LL*f[i]*Inv%mod;
}
}
inline void inv(int *F,int *G,CI n)
{
if (n==1) return (void)(G[0]=quick_pow(F[0]));
inv(F,G,n+1>>1); init(n<<1); copy(F,F+n,T);
NTT(T,1); NTT(G,1); for (RI i=0;i<lim;++i)
G[i]=1LL*sub(2,1LL*T[i]*G[i]%mod)*G[i]%mod;
NTT(G,-1); fill(T+n,T+lim,0); fill(G+n,G+lim,0);
}
public:
inline void get_inv(int *F,int *G,CI n)
{
for (lim=1;lim<=(n<<1);lim<<=1);
fill(T,T+lim,0); fill(G,G+lim,0); inv(F,G,n);
}
}P;
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
File.read(n); File.read(r); invr=quick_pow(sub(1,r)); mtir=1LL*invr*r%mod;
RI i; for (init(n),i=0;i<=n;++i) File.read(A[i]),F[i]=sum(mod,-1LL*inv[i]*mtir%mod);
for (F[0]=1,P.get_inv(F,G,n+1),i=0;i<=n;++i) G[i]=1LL*G[i]*fact[i]%mod*invr%mod;
for (i=0;i<=n;++i) ans=sum(ans,1LL*G[i]*A[i]%mod); return printf("%d",ans),0;
}
Luogu P5349 幂的更多相关文章
- [luogu P5349] 幂 解题报告 (分治FFT)
interlinkage: https://www.luogu.org/problemnew/show/P5349 description: solution: 设$g(x)=\sum_{n=0}^{ ...
- Luogu P1010 幂次方
[橙题不会做系列]QAQ 是李老师上课的题目-- 这题最开始想法是打表做.事实证明这样做也可以( 老师用的是位运算-- 这种一步步分解也能想到用递归qwq #include <algorithm ...
- p5349 幂
分析 https://www.cnblogs.com/cjyyb/p/10822490.html 代码 #include<bits/stdc++.h> using namespace st ...
- Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...
- Luogu T7152 细胞(递推,矩阵乘法,快速幂)
Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...
- 【luogu P3390 矩阵快速幂】 模板
题目链接:https://www.luogu.org/problemnew/show/P3390 首先要明白矩阵乘法是什么 对于矩阵A m*p 与 B p*n 的矩阵 得到C m*n 的矩阵 矩阵 ...
- Luogu P3390 【模板】矩阵快速幂
题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...
- Luogu P1226 取余运算||快速幂_快速幂
超短代码 #include<iostream> #include<cstdio> using namespace std; long long b,p,k; long long ...
随机推荐
- 3-1Java程序的执行流程
3-1Java程序的执行流程 用记事本写一个简单的程序 存到:E:\java路径下 class HelloImooc{ public static void main(String[] agrg ...
- Laravel框架之Response操作
public function response(){ //响应json /*$data = [ 'errCode'=>0, 'errMsg' =>'success', 'data' =& ...
- msq 表操作与其数据类型
一:表介绍 表相当于文件, 表中的一条记录就相当于文件的一行内容, 不同的是,表中的一条记录有对应的标题,称为表的字段: id,name, age, sex,称为字段, 其余的一行内容称为一条记录. ...
- iCarousel的简单介绍及应用
iOS开源类iCarousel介绍 iCarousel是一个类,它继承于UIView,用于简化实现各种类型的旋转木马(分页滚动视图)iPhone.iPad和Mac OS.iCarousel实现一些常见 ...
- Lightoj 1129【字典树】
题意:如果存在一个串是另一个串的公共前缀就是NO,否则就是YES 思路:利用字典树的特性搞搞就好了 #include <bits/stdc++.h> using namespace std ...
- 51nod 1348【next_permutation】
next_permutation的粗讲来自窝bin博客 两个重载函数,第二个带谓词参数_Comp,其中只带两个参数的版本,默认谓词函数为"小于". 返回值:bool类型 分析nex ...
- OPENGL_单位长度对应屏幕像素
gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar) fovy:视角,指定视景体的视野的角度,以度数为单 ...
- Codevs 1141 数列
1141 数列 题目描述 Description 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9, ...
- [Xcode 实际操作]八、网络与多线程-(1)使用Reachability类库检测网络的连接状态
目录:[Swift]Xcode实际操作 本文将演示如何使用Reachability网络状态检测库,检测设备的网络连接状态. 需要下载一个开源的类库:[ashleymills/Reachability. ...
- 【SpringCloud构建微服务系列】分布式链路跟踪Spring Cloud Sleuth
一.背景 随着业务的发展,系统规模越来越大,各微服务直接的调用关系也变得越来越复杂.通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用协同产生最后的请求结果,几乎每一个前端请求都会形成一 ...