网站加速 wordpress,苏州百度推广分公司电话,公司免费注册,福清市建设工程交易网站好像多项式对数函数|指数函数
这个思路就是先求导然后再积分#xff0c;这样就可以得到一个式子#xff0c;对于多项式对数函数#xff0c;我们就可以直接求解了#xff0c;然后对于多项式指数函数还需要使用分治fft。
多项式对数#xff1a;
#includebits/stdc.h
…多项式对数函数|指数函数
这个思路就是先求导然后再积分这样就可以得到一个式子对于多项式对数函数我们就可以直接求解了然后对于多项式指数函数还需要使用分治fft。
多项式对数
#includebits/stdc.h
#define LL long long
using namespace std;
inline int read()
{char x\0;int fh1,sum0;for(xgetchar();x0||x9;xgetchar())if(x-)fh-1;for(;x0x9;xgetchar())sumsum*10x-0;return fh*sum;
}
const int N400009;
const int mod998244353;
int n,m;
inline int ksm(int a,int b)
{int sum1;while(b){if(b1)sum1LL*sum*a%mod;b1;a1LL*a*a%mod;}return sum;
}
int F[N],G[N],rev[N],l,tt;
inline void getl(int len)
{for(l1,tt0;llen;l1)tt;for(int i0;il;i) rev[i](rev[i1]1)|((i1)(tt-1));
}
inline void NTT(int *P,int op)
{for(int i0;il;i)if(irev[i])swap(P[i],P[rev[i]]);for(int i1;il;i1){int wnksm(3,(mod-1)/(i1));if(op0)wnksm(wn,mod-2);for(int j0,pi1;jl;jp){for(int k0,w1;ki;k,w1ll*w*wn%mod){int xP[jk],y1LL*P[jik]*w%mod;P[jk](xy)%mod,P[jik](x-ymod)%mod;} }}if(op0)for(int i0,uksm(l,mod-2);il;i)P[i]1LL*P[i]*u%mod;
}
int C[N],D[N];
inline void getinv(int *f,int *g,int n)
{if(n1)return g[0]ksm(f[0],mod-2),void();getinv(f,g,n1);getl(n);for(int i0;in;i) C[i]f[i],D[i]g[i];for(int in;il;i) C[i]D[i]0; NTT(C,1),NTT(D,1);for(int i0;il;i) C[i]1LL*C[i]*D[i]%mod*D[i]%mod; NTT(C,-1);for(int i0;in;i) g[i]((2LL*g[i]%mod-C[i])%modmod)%mod;
}
void dao(int *A,int *B,int len)
{for(int i1;ilen;i)B[i-1]1LL*i*A[i]%mod;B[len-1]0;
}
void jifen(int *A,int *B,int len)
{for(int i1;ilen;i)B[i]1LL*A[i-1]*ksm(i,mod-2)%mod;B[0]0;
}
int A[N],B[N];
void getln(int *f,int *g,int n)
{dao(f,A,n);getinv(f,B,n);getl(n),NTT(A,1),NTT(B,1);for(int i0;il;i)A[i]1LL*A[i]*B[i]%mod;NTT(A,-1);jifen(A,g,n);
}
int main()
{nread();for(int i0;in;i)F[i]read();for(m1;mn;m1); getln(F,G,m);for(int i0;in;i) printf(%d ,G[i]);return 0;
}
细节
首先需要一个封装好的NTT然后每次需要重新求解l和rev对于中间数组需要用到ABCD4个但是使用过程中不能直接清空所以在每次使用的时候要将空余的位置设置为0保证有效位置都是正确的过程中直接传递指针就可以递归求解了。