萌新自闭了,哪位大佬帮帮我啊QAQ

P4726 【模板】多项式指数函数(多项式 exp)

```cpp #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #define ll long long #define N 400003 #define reg register #define p 998244353 using namespace std; struct poly{ int t; int a[N]; }; int rev[N],invv[N]; poly F; inline void read(int &x); void print(int x); inline int power(int a,int t); void NTT(poly &f,int type,int lim); inline void qwqqq(poly f,poly g,poly &res,int lim); inline void print_poly(poly f); inline void clear(poly &f); void reverse(poly &f); poly multiply(poly f,poly g); poly inverse(poly f); poly logarithm(poly f); poly integral(poly f); poly derivative(poly f); poly exponential(poly f); poly add(poly f,poly g); poly subtract(poly f,poly g); poly devide(poly f,poly g); poly mod(poly f,poly g,poly q); signed main(){ int n; read(n); --n; for(int i=0;i<=n;++i) read(F.a[i]); F.t = n; F = exponential(F); print_poly(F); return 0; } poly exponential(poly f){ int n = f.t; if(n==0){ f.a[0] = 1; return f; } poly h,g = f; g.t >>= 1; clear(g); h = exponential(g); //exp h.t = n; g = logarithm(h); //ln for(int i=0;i<=n;++i) g.a[i] = (f.a[i]-g.a[i]+p)%p; g.a[0] = (g.a[0]+1)%p; g = multiply(h,g); //多项式乘法 g.t = n; clear(g); return g; } //以下是其它板子 inline void clear(poly &f){ for(reg int i=f.t+1;i<N;++i) f.a[i] = 0; } poly inverse(poly f){ int cur = 0,base,l = 0,lim,n; base = 1; lim = 2; n = f.t; poly g[2]; g[cur].a[0] = power(f.a[0],p-2); while(base<=(n<<1)){ for(int i=1;i<=lim;++i) rev[i] = (rev[i>>1]>>1)|((i&1)<<l); cur ^= 1; memset(g[cur].a,0,sizeof(g[cur].a)); for(reg int i=0;i<base;++i) g[cur].a[i] = (g[cur^1].a[i]<<1)%p; cur ^= 1; qwqqq(g[cur],g[cur],g[cur],lim); qwqqq(g[cur],f,g[cur],lim); cur ^= 1; for(int i=0;i<base;++i) g[cur].a[i] = (g[cur].a[i]-g[cur^1].a[i]+p)%p; base <<= 1,lim <<= 1; ++l; } g[cur].t = n; clear(g[cur]); return g[cur]; } poly mod(poly f,poly g,poly q){ poly res; int m = g.t; f.t = m; q.t = min(q.t,m); clear(f),clear(g),clear(q); res = subtract(f,multiply(q,g)); res.t = m-1; clear(res); return res; } poly devide(poly f,poly g){ poly q; int n = f.t,m = g.t; reverse(f),reverse(g); g.t = f.t = n-m+1; clear(f),clear(g); q = multiply(f,inverse(g)); q.t = n-m; reverse(q); return q; } poly subtract(poly f,poly g){ int l = max(f.t,g.t); for(reg int i=0;i<=l;++i) f.a[i] = (f.a[i]-g.a[i]+p)%p; return f; } poly add(poly f,poly g){ int l = max(f.t,g.t); for(reg int i=0;i<=l;++i) f.a[i] = (f.a[i]+g.a[i])%p; return f; } void reverse(poly &f){ int l = f.t>>1; for(reg int i=0;i<=l;++i) swap(f.a[i],f.a[f.t-i]); } poly logarithm(poly f){ clear(f); int m = f.t; f = multiply(derivative(f),inverse(f)); f.t = m; f = integral(f); --f.t; clear(f); return f; } poly integral(poly f){ invv[1] = 1; ++f.t; for(int i=2;i<=f.t;++i) invv[i] = (ll)(p-p/i)*invv[p%i]%p; for(reg int i=f.t;i>=1;--i) f.a[i] = (ll)f.a[i-1]*invv[i]%p; f.a[0] = 0; return f; } poly derivative(poly f){ for(reg int i=0;i<f.t;++i) f.a[i] = (ll)f.a[i+1]*(i+1)%p; f.a[f.t] = 0; return f; } inline void qwqqq(poly f,poly g,poly &res,int lim){ poly F,G; memset(F.a,0,sizeof(F.a)); memset(G.a,0,sizeof(G.a)); for(int i=0;i<=(lim>>1);++i){ F.a[i] = f.a[i]; G.a[i] = g.a[i]; } NTT(F,1,lim),NTT(G,1,lim); for(int i=0;i<=lim;++i) F.a[i] = (ll)F.a[i]*G.a[i]%p; NTT(F,-1,lim); int inv = power(lim,p-2); for(int i=0;i<=lim;++i) res.a[i] = (ll)F.a[i]*inv%p; } inline void print_poly(poly f){ for(int i=0;i<=f.t;++i){ print(f.a[i]); putchar(' '); } putchar('\n'); } poly multiply(poly f,poly g){ int n = f.t,m = g.t; int inv,lim = 1,l = 0; while(lim<=n+m){ lim <<= 1; ++l; } --l; for(int i=1;i<=lim;++i) rev[i] = (rev[i>>1]>>1)|((i&1)<<l); NTT(f,1,lim),NTT(g,1,lim); for(int i=0;i<=lim;++i) f.a[i] = (ll)f.a[i]*g.a[i]%p; NTT(f,-1,lim); inv = power(lim,p-2); for(int i=0;i<=lim;++i) f.a[i] = (ll)f.a[i]*inv%p; f.t = n+m; return f; } void NTT(poly &f,int type,int lim){ for(int i=0;i<=lim;++i){ if(i>=rev[i]) continue; swap(f.a[i],f.a[rev[i]]); } for(int mid=1;mid<lim;mid<<=1){ int rt = power(3,(p-1)/(mid<<1)); if(type==-1) rt = power(rt,p-2); int r = mid<<1; for(int j=0;j<lim;j+=r){ int w = 1; for(int k=0;k<mid;++k){ int x = f.a[j+k]; int y = (ll)w*f.a[j+k+mid]%p; f.a[j+k] = (x+y)%p; f.a[j+k+mid] = ((x-y)%p+p)%p; w = (ll)w*rt%p; } } } } inline int power(int a,int t){ int res = 1; while(t){ if(t&1) res = (ll)res*a%p; a = (ll)a*a%p; t >>= 1; } return res; } inline void read(int &x){ x = 0; char c = getchar(); while(c<'0'||c>'9') c = getchar(); while(c>='0'&&c<='9'){ x = (x<<3)+(x<<1)+(c^48); c = getchar(); } } void print(int x){ if(x>9) print(x/10); putchar(x%10+'0'); } ```
by NaCly_Fish @ 2019-03-14 20:10:26


那个$t$表示多项式的次数
by NaCly_Fish @ 2019-03-14 20:11:42


stO%%%%dalao又来装弱了
by WYXkk @ 2019-03-14 20:12:07


orz巨佬怒切黑题
by AC_Automation @ 2019-03-14 20:12:29


枫姐姐太强辣Orz
by VenusM1nT @ 2019-03-14 20:15:29


@[Venus](/space/show?uid=23243) 云妹妹天天把我吊起来打QAQ
by NaCly_Fish @ 2019-03-14 20:16:36


咸鱼姐姐又切黑题了
by Loser_King @ 2019-03-14 20:17:01


@[NaCly_Fish](/space/show?uid=115864) “不到30行的代码”
by Le_temps_des_fleurs @ 2019-03-14 20:18:24


~~去你的萌新~~
by Le_temps_des_fleurs @ 2019-03-14 20:18:38


哪里没到$30$行了qwq
by wxy_god @ 2019-03-14 20:18:45


| 下一页