#pragma once
#include"library/bitwise/Ranked.hpp"
#include"library/util/Valarray.hpp"template<typenameT>structSetPowerSeries:Valarray<T>{usingSPS=SetPowerSeries;usingValarray<T>::Valarray;usingValarray<T>::size;usingValarray<T>::at;usingvalue_type=T;SetPowerSeries(conststd::vector<T>&f):Valarray<T>(f){}SPSoperator-()const{returnSPS(Valarray<T>::operator-());}SPSoperator*(constSPS&b)const{returnSPS(BitwiseRanked::convolution<T>(*this,b));}SPS&operator*=(constSPS&b){return(*this)=(*this)*b;}};
#line 2 "library/bitwise/Util.hpp"
namespacebitwise{staticintlog2(intN){intn=__builtin_ffs(N)-1;assert((1<<n)==N);returnn;}staticboolin(intS,inta){return(S>>a)&1;}}#line 3 "library/bitwise/Ranked.hpp"
#define REP_(i, n) for (int i = 0; i < (n); i++)
#define RREP_(i, n) for (int i = (n) - 1; i >= 0; i--)
classBitwiseRanked{staticintpopcount(intS){return__builtin_popcount(S);}public:template<typenameT>staticstd::vector<std::vector<T>>zeta(conststd::vector<T>&A){constintn=bitwise::log2(A.size());std::vector<std::vector<T>>RA(1<<n,std::vector<T>(n+1,0));REP_(S,1<<n)RA[S][popcount(S)]=A[S];REP_(i,n)REP_(S,1<<n)if(!bitwise::in(S,i))REP_(d,n+1)RA[S|(1<<i)][d]+=RA[S][d];returnRA;}template<typenameT>staticstd::vector<T>mobius(std::vector<std::vector<T>>RA){constintn=bitwise::log2(RA.size());REP_(i,n)REP_(S,1<<n)if(!bitwise::in(S,i))REP_(d,n+1)RA[S|(1<<i)][d]-=RA[S][d];std::vector<T>A(1<<n);REP_(S,1<<n)A[S]=RA[S][popcount(S)];returnA;}template<typenameT>staticstd::vector<T>convolution(conststd::vector<T>&A,conststd::vector<T>&B){constintn=bitwise::log2(A.size());autoRA=zeta(A);autoRB=zeta(B);REP_(S,1<<n){auto&ra=RA[S],rb=RB[S];RREP_(d,n+1){ra[d]*=rb[0];REP_(i,d)ra[d]+=ra[i]*rb[d-i];}}returnmobius(RA);}};#undef REP_
#undef RREP_
#line 1 "library/util/Valarray.hpp"
#include<functional>
#include<ranges>
#include<vector>template<typenameT>structValarray:std::vector<T>{usingstd::vector<T>::vector;// コンストラクタ継承Valarray(conststd::vector<T>&v):std::vector<T>(v.begin(),v.end()){}private:template<typenameOp>Valarray&apply_inplace(constValarray&other,Opop){if(this->size()<other.size())this->resize(other.size(),T(0));for(auto[a,b]:std::views::zip(*this,other))a=op(a,b);return*this;}public:Valarray&operator+=(constValarray&other){returnapply_inplace(other,std::plus<>());}Valarray&operator-=(constValarray&other){returnapply_inplace(other,std::minus<>());}Valarray&operator*=(constValarray&other){returnapply_inplace(other,std::multiplies<>());}Valarray&operator/=(constValarray&other){returnapply_inplace(other,std::divides<>());}friendValarrayoperator+(Valarraya,constValarray&b){returna+=b;}friendValarrayoperator-(Valarraya,constValarray&b){returna-=b;}friendValarrayoperator*(Valarraya,constValarray&b){returna*=b;}friendValarrayoperator/(Valarraya,constValarray&b){returna/=b;}Valarrayoperator-()const{Valarrayg=*this;for(T&a:g)a=-a;returng;}};#line 4 "library/setpowerseries/Base.hpp"
template<typenameT>structSetPowerSeries:Valarray<T>{usingSPS=SetPowerSeries;usingValarray<T>::Valarray;usingValarray<T>::size;usingValarray<T>::at;usingvalue_type=T;SetPowerSeries(conststd::vector<T>&f):Valarray<T>(f){}SPSoperator-()const{returnSPS(Valarray<T>::operator-());}SPSoperator*(constSPS&b)const{returnSPS(BitwiseRanked::convolution<T>(*this,b));}SPS&operator*=(constSPS&b){return(*this)=(*this)*b;}};