hdu 6061 NTT

来源:互联网 发布:淘宝直播卖东西可信吗 编辑:程序博客网 时间:2024/05/21 08:52
#pragma comment(linker, "/STACK:102400000,102400000")#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2*1e5+5;const ll mod=998244353;const ll P=mod;//费马素数const ll G=3;//原根ll inv[maxn],facinv[maxn],fac[maxn],c[maxn];ll a[2*maxn],b[2*maxn],wn[26];ll mul(ll x,ll y){    return (x%P)*(y%P)%P;}ll quick_mod(ll a,ll b){  ll res=1;  while(b)  {    if(b&1)        res=res*a%P;    a=a*a%mod;    b>>=1;  }  return res;}void GetWn(){    for(int i=0;i<26;i++)    {        int t =1<<i;        wn[i]=quick_mod(G,(P-1)/t);    }}void Rader(ll a[],int len){    int j=len>>1;    for(int i=1;i<len-1;i++)    {        if(i<j) swap(a[i],a[j]);        int k=len>>1;        while(j>=k)        {            j-=k;            k>>=1;        }        if(j<k)            j+=k;    }}void NTT(ll a[],int len,int on){    Rader(a,len);    int id=0;    for(int h=2;h<=len;h<<=1)    {        id++;        for(int j=0;j<len;j+=h)        {            ll w=1;            for(int k=j;k<j+h/2;k++)            {                ll u=a[k];                ll t=mul(w,a[k+h/2]);                a[k]=(u+t)%P;                a[k+h/2]=((u-t)%P+P)%P;                w=mul(w,wn[id]);            }        }    }    if(on==-1)    {        for(int i=1;i<len/2;i++)            swap(a[i],a[len-i]);        ll Inv=quick_mod(len,P-2);        for(int i=0;i<len;i++)            a[i]=mul(a[i],Inv);    }}void Conv(ll a[],ll b[],int n){    NTT(a,n,1);    NTT(b,n,1);    for(int i=0;i<n;i++)        a[i]=mul(a[i],b[i]);    NTT(a,n,-1);}void init(){    fac[0]=facinv[0]=fac[1]=facinv[1]=inv[1]=inv[0]=1;    for(int i=2;i<maxn;i++)    {        inv[i]=(mod-mod/i)*inv[mod%i]%mod;        fac[i]=i*fac[i-1]%mod;        facinv[i]=inv[i]*facinv[i-1]%mod;    }}int main(){    ///////////////////////////////////////////////////    GetWn();    init();    //////////////////////////////////////////////////    int n,m,i;    while(scanf("%d",&n)!=EOF)    {        for(i=0;i<=n;i++)            scanf("%lld",c+i);        scanf("%d",&m);        ll sum=0,tp;        for(i=1;i<=m;i++)        {            scanf("%lld",&tp);            sum=(sum-tp+mod)%mod;        }        //////////////////////////////////////////////////        int len=1;        while(len<2*(n+1))            len<<=1;        //////////////////////////////////////////////////        ll res=1;        for(i=0;i<=n;i++)        {            a[i]=res*facinv[i]%mod;            res=res*sum%mod;            b[i]=c[n-i]*fac[n-i]%mod;        }        //////////////////////////////////////////////////        for(int i=n+1;i<len;i++)            a[i]=b[i]=0;        Conv(a,b,len);        //////////////////////////////////////////////////存在a数组中        for(int i=0;i<=n;i++)            printf("%lld ",a[n-i]*facinv[i]%mod);        printf("\n");    }    return 0;}

原创粉丝点击