[cogs2189][HZOI 2015]帕秋莉的超级多项式

cogs

题意

\[((1+\ln(1+\frac{1}{\exp \int \frac{1}{\sqrt{F(x)}}}))^k)'\]

sol

放个板子。。。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int gi()
{
    int x=0,w=1;char ch=getchar();
    while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if (ch=='-') w=0,ch=getchar();
    while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return w?x:-x;
}
const int _ = 3e5+5;
const int mod = 998244353;
int rev[_],inv[_],og[_];
int fastpow(int a,int b)
{
    int res=1;
    while (b) {if (b&1) res=1ll*res*a%mod;a=1ll*a*a%mod;b>>=1;}
    return res;
}
void NTT(int *P,int opt,int n)
{
    int len,l=0;
    for (len=1;len<n;len<<=1) ++l;--l;
    for (int i=0;i<len;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<l);
    for (int i=0;i<len;++i) if (i<rev[i]) swap(P[i],P[rev[i]]);
    for (int i=1;i<len;i<<=1)
    {
        int W=fastpow(3,(mod-1)/(i<<1));
        if (opt==-1) W=fastpow(W,mod-2);
        og[0]=1;for (int j=1;j<i;++j) og[j]=1ll*og[j-1]*W%mod;
        for (int p=i<<1,j=0;j<len;j+=p)
            for (int k=0;k<i;++k)
            {
                int X=P[j+k],Y=1ll*P[j+k+i]*og[k]%mod;
                P[j+k]=(X+Y)%mod;P[j+k+i]=(X-Y+mod)%mod;
            }
    }
    if (opt==-1)
        for (int i=0,Inv=fastpow(len,mod-2);i<len;++i)
            P[i]=1ll*P[i]*Inv%mod;
}
int A[_],B[_];
void GetInv(int *a,int *b,int len)
{
    if (len==1) {b[0]=fastpow(a[0],mod-2);return;}
    GetInv(a,b,len>>1);
    for (int i=0;i<len;++i) A[i]=a[i],B[i]=b[i];
    NTT(A,1,len<<1);NTT(B,1,len<<1);
    for (int i=0;i<(len<<1);++i) A[i]=1ll*A[i]*B[i]%mod*B[i]%mod;
    NTT(A,-1,len<<1);
    for (int i=0;i<len;++i) b[i]=((b[i]+b[i])%mod-A[i]+mod)%mod;
    for (int i=0;i<(len<<1);++i) A[i]=B[i]=0;
}
int C[_],D[_];
void GetSqrt(int *a,int *b,int len)
{
    if (len==1) {b[0]=sqrt(a[0]);return;}
    GetSqrt(a,b,len>>1);
    for (int i=0;i<len;++i) C[i]=a[i];
    GetInv(b,D,len);
    NTT(C,1,len<<1);NTT(D,1,len<<1);
    for (int i=0;i<(len<<1);++i) D[i]=1ll*D[i]*C[i]%mod;
    NTT(D,-1,len<<1);
    for (int i=0;i<len;++i) b[i]=1ll*(b[i]+D[i])%mod*inv[2]%mod;
    for (int i=0;i<(len<<1);++i) C[i]=D[i]=0;
}
void Dao(int *a,int *b,int len)
{
    for (int i=1;i<len;++i) b[i-1]=1ll*i*a[i]%mod;
    b[len]=b[len-1]=0;
}
void Jifen(int *a,int *b,int len)
{
    for (int i=1;i<len;++i) b[i]=1ll*a[i-1]*inv[i]%mod;
    b[0]=0;
}
void Getln(int *a,int *b,int len)
{
    int A[_],B[_];
    memset(A,0,sizeof(A));memset(B,0,sizeof(B));
    Dao(a,A,len);GetInv(a,B,len);
    NTT(A,1,len<<1);NTT(B,1,len<<1);
    for (int i=0;i<(len<<1);++i) A[i]=1ll*A[i]*B[i]%mod;
    NTT(A,-1,len<<1);
    Jifen(A,b,len);
}
int E[_];
void GetExp(int *a,int *b,int len)
{
    if (len==1) {b[0]=1;return;}
    GetExp(a,b,len>>1);
    for (int i=0;i<len;++i) D[i]=b[i];
    Getln(b,E,len);
    for (int i=0;i<len;++i) E[i]=(mod-E[i]+a[i])%mod;E[0]=(E[0]+1)%mod;
    NTT(D,1,len<<1);NTT(E,1,len<<1);
    for (int i=0;i<(len<<1);++i) D[i]=1ll*D[i]*E[i]%mod;
    NTT(D,-1,len<<1);
    for (int i=0;i<len;++i) b[i]=D[i];
    for (int i=0;i<(len<<1);++i) D[i]=E[i]=0;
}
void GetPow(int *a,int *b,int len,int k)
{
    int F[_];memset(F,0,sizeof(F));
    Getln(a,F,len);
    for (int i=0;i<len;++i) F[i]=1ll*F[i]*k%mod;
    GetExp(F,b,len);
}
int X[_],Y[_];
int main()
{
    freopen("polynomial.in","r",stdin);
    freopen("polynomial.out","w",stdout);
    int n=gi(),k=gi(),len;
    for (int i=0;i<n;++i) X[i]=gi();
    for (len=1;len<=n;len<<=1);
    inv[0]=inv[1]=1;
    for (int i=2;i<len;++i) inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
    GetSqrt(X,Y,len);memset(X,0,sizeof(X));
    GetInv(Y,X,len);memset(Y,0,sizeof(Y));
    Jifen(X,Y,len);memset(X,0,sizeof(X));
    GetExp(Y,X,len);memset(Y,0,sizeof(Y));
    GetInv(X,Y,len);memset(X,0,sizeof(X));
    Y[0]=(Y[0]+1)%mod;
    Getln(Y,X,len);memset(Y,0,sizeof(Y));
    X[0]=(X[0]+1)%mod;
    GetPow(X,Y,len,k);memset(X,0,sizeof(X));
    Dao(Y,X,len);
    for (int i=0;i<n-1;++i) printf("%d ",X[i]);
    puts("0");return 0;
}

猜你喜欢

转载自www.cnblogs.com/zhoushuyu/p/8939623.html