传送门

如同题目所描述的一样,这是一道板题。

题意简述:给你一个数组g1,2,...ng_{1,2,...n}g1,2,...n​并定义f0=1,fi=∑j=1ifi−jgjf_0=1,f_i=\sum_{j=1}^if_{i-j}g_jf0​=1,fi​=∑j=1i​fi−j​gj​,让你求f0,1,...,nf_{0,1,...,n}f0,1,...,n​


解析

代码 :

#include<bits/stdc++.h>
#define ri register int
#define add(a,b) ((a)+(b)>=mod?(a)+(b)-mod:(a)+(b))
#define dec(a,b) ((a)>=(b)?(a)-(b):(a)-(b)+mod)
#define mul(a,b) ((ll)(a)*(b)%mod)
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
typedef long long ll;
const int N=1e5+5,mod=998244353;
int n,lim,tim;
vector<int>A,B,pos;
inline void init(const int&up){
    lim=1,tim=0;
    while(lim<=up*2)lim<<=1,++tim;
    A.resize(lim),B.resize(lim),pos.resize(lim),pos[0]=0;
    for(ri i=0;i<lim;++i)pos[i]=(pos[i>>1]>>1)|((i&1)<<(tim-1));
}
inline int ksm(int a,int p){int ret=1;for(;p;p>>=1,a=mul(a,a))if(p&1)ret=mul(ret,a);return ret;}
inline void ntt(vector<int>&a,const int&type){
    for(ri i=0;i<lim;++i)if(i<pos[i])swap(a[i],a[pos[i]]);
    for(ri mid=1,wn,mult=(mod-1)/2,typ=type==1?3:(mod+1)/3;mid<lim;mid<<=1,mult>>=1){
        wn=ksm(typ,mult);
        for(ri j=0,len=mid<<1;j<lim;j+=len)for(ri w=1,k=0,a0,a1;k<mid;++k,w=mul(w,wn)){
            a0=a[j+k],a1=mul(w,a[j+k+mid]);
            a[j+k]=add(a0,a1),a[j+k+mid]=dec(a0,a1);
        }
    }
    if(type==-1)for(ri i=0,inv=ksm(lim,mod-2);i<lim;++i)a[i]=mul(a[i],inv);
}
struct poly{
    vector<int>a;
    poly(int k=0,int x=0){a.resize(k+1),a[k]=x;}
    inline poly extend(const int&k){poly ret=*this;return ret.a.resize(k+1),ret;}
    inline int deg()const{return a.size()-1;}
    inline int&operator[](const int&k){return a[k];}
    inline const int&operator[](const int&k)const{return a[k];}
};
inline void cdqFFT(poly&a,poly&b,int l,int r){
    if(l==r)return;
    int mid=l+r>>1;
    cdqFFT(a,b,l,mid),init(2*(r-l+1));
    for(ri i=0;i<lim;++i)A[i]=B[i]=0;
    for(ri i=l;i<=mid;++i)A[i-l]=a[i];
    for(ri i=0;i<=r-l;++i)B[i]=b[i];
    ntt(A,1),ntt(B,1);
    for(ri i=0;i<lim;++i)A[i]=mul(A[i],B[i]);
    ntt(A,-1);
    for(ri i=mid+1;i<=r;++i)a[i]=add(a[i],A[i-l]);
    cdqFFT(a,b,mid+1,r);
}
int main(){
    n=read()-1;
	poly a(n),b(n);
	a.extend(n),b.extend(n),a[0]=1;
    for(ri i=1;i<=n;++i)b[i]=read(),a[i]=0;
    cdqFFT(a,b,0,n);
 	for(ri i=0;i<=n;++i)cout<<a[i]<<' ';
    return 0;
}

最新文章

  1. ffmpeg实现dxva2硬件加速
  2. ORA-12519: TNS:no appropriate service handler found 解决(转)
  3. git管理测试生产环境代码
  4. 测试你是否和LTC水平一样高[HDU1407]
  5. Mysql查询优化器浅析
  6. 为什么说汽车VIN码是汽车唯一的&quot;身份证&quot;
  7. 第四十八条:如果需要精确的答案,请避免使用float和double
  8. Docker 多主机网络总结(非常全)
  9. sortable的基本属性
  10. tomcat发布项目如何通过域名直接访问
  11. Oracle获取一周前,一个月前,一年前, 本周,本月,当年的日期
  12. 四张图带你了解Tomcat系统架构
  13. Python2安装igraph
  14. JPush Flutter Plugin(Futter推送-极光推送)
  15. 2018.11.01 NOIP训练 图论(线段树+倍增+dfs序)
  16. 自然语言交流系统 phxnet团队 创新实训 个人博客 (七)
  17. TFS 切换登录用户的方法[转]
  18. Redis 键空间通知
  19. 根据sys.database_mirroring查询镜像数据库同步状态
  20. angular中的cookies与cookieStore区别

热门文章

  1. Selenium 定位元素原理,基本API,显示等待,隐式等待,重试机制等等
  2. php中bootstrap框架.popover弹出框,鼠标移动到上面自动显示,离开自动消失
  3. ES6之对象的简洁表示法
  4. css3动画:执行前不显示,执行后显示
  5. [HDOJ]Coin Change(DP)
  6. 896. Monotonic Array单调数组
  7. php解析优酷网上的视频资源去广告
  8. 浅谈XListView的使用
  9. Django中反向生成models
  10. LIS LCS 最长上升子序列 最长公共子序列 ...