#pragma once
#include"set/subset-convolution.hpp"namespaceSetPowerSeries{template<classmint,intsz=21>vector<mint>exp(constvector<mint>&a){staticSubsetConvolution<mint,sz>sc;assert(a[0]==0);intl=__builtin_ctz(a.size());assert(a.size()==(1<<l));vector<mint>f(1<<l,0);f[0]=1;for(intk=0;k<l;k++){vector<mint>g(f.begin(),f.begin()+(1<<k));vector<mint>h(a.begin()+(1<<k),a.begin()+(2<<k));g=sc.multiply(g,h);copy(g.begin(),g.end(),f.begin()+(1<<k));}returnf;}};// namespace SetPowerSeries/**
* @brief Exp Of Set Power Series
*/
#line 2 "set/subset-convolution.hpp"
template<classmint,intn_>structSubsetConvolution{staticconstexprintn=n_;usingpoly=array<mint,n_+1>;vector<int>pc;SubsetConvolution(){pc.assign(1<<n,0);for(inti=1;i<pc.size();i++)pc[i]=pc[i>>1]+(i&1);}voidpoly_add(poly&p,constpoly&q,intd){for(inti=0;i<d;i++)p[i]+=q[i];}voidpoly_sub(poly&p,constpoly&q,intd){for(inti=d;i<=n;i++)p[i]-=q[i];}voidpoly_mul(poly&p,constpoly&q){polyr{};for(inti=0;i<=n;i++)for(intj=0;j<=n-i;j++)r[i+j]+=p[i]*q[j];swap(p,r);}vector<poly>lift(constvector<mint>&a){intn=a.size();assert(n==(n&-n));vector<poly>b(n);for(inti=0;i<n;i++){b[i].fill(0);b[i][pc[i]]=a[i];}returnb;}vector<mint>unlift(constvector<poly>&b){intn=b.size();assert(n==(n&-n));vector<mint>a(n);for(inti=0;i<n;i++)a[i]=b[i][pc[i]];returna;}voidranked_zeta(vector<poly>&a){intn=a.size();for(inti=1;i<n;i<<=1)for(intj=0;j<n;j+=i*2)for(intk=0;k<i;k++)poly_add(a[i+j+k],a[j+k],pc[i+j+k]);}voidranked_mobius(vector<poly>&a){intn=a.size();for(inti=1;i<n;i<<=1)for(intj=0;j<n;j+=i*2)for(intk=0;k<i;k++)poly_sub(a[i+j+k],a[j+k],pc[i+j+k]);}voidranked_mul(vector<poly>&a,constvector<poly>&b){for(inti=0;i<a.size();i++)poly_mul(a[i],b[i]);}vector<mint>multiply(constvector<mint>&a,constvector<mint>&b){autop=lift(a);autoq=lift(b);ranked_zeta(p);ranked_zeta(q);ranked_mul(p,q);ranked_mobius(p);returnunlift(p);}};/**
* @brief Subset Convolution
* @docs docs/set/subset-convolution.md
*/#line 3 "set/exp-of-set-power-series.hpp"
namespaceSetPowerSeries{template<classmint,intsz=21>vector<mint>exp(constvector<mint>&a){staticSubsetConvolution<mint,sz>sc;assert(a[0]==0);intl=__builtin_ctz(a.size());assert(a.size()==(1<<l));vector<mint>f(1<<l,0);f[0]=1;for(intk=0;k<l;k++){vector<mint>g(f.begin(),f.begin()+(1<<k));vector<mint>h(a.begin()+(1<<k),a.begin()+(2<<k));g=sc.multiply(g,h);copy(g.begin(),g.end(),f.begin()+(1<<k));}returnf;}};// namespace SetPowerSeries/**
* @brief Exp Of Set Power Series
*/