#pragma once
#include<vector>
#include"Mylib/Convolution/fast_mobius_transform_superset.cpp"
#include"Mylib/Convolution/fast_zeta_transform_superset.cpp"namespacehaar_lib{template<typenameT>std::vector<T>convolution_and(std::vector<T>f,std::vector<T>g){f=fast_zeta_transform_superset(f);g=fast_zeta_transform_superset(g);for(size_ti=0;i<f.size();++i)f[i]*=g[i];f=fast_mobius_transform_superset(f);returnf;}}// namespace haar_lib
#line 2 "Mylib/Convolution/convolution_and.cpp"
#include<vector>
#line 2 "Mylib/Convolution/fast_mobius_transform_superset.cpp"
#include<cassert>
#include<functional>
#line 5 "Mylib/Convolution/fast_mobius_transform_superset.cpp"
namespacehaar_lib{template<typenameT,typenameFunc=std::minus<T>>std::vector<T>fast_mobius_transform_superset(std::vector<T>f,constFunc&op=std::minus<T>()){constintN=f.size();assert((N&(N-1))==0&&"N must be a power of 2");for(inti=1;i<N;i<<=1){for(intj=0;j<N;++j){if(not(j&i))f[j]=op(f[j],f[j^i]);}}returnf;}}// namespace haar_lib#line 5 "Mylib/Convolution/fast_zeta_transform_superset.cpp"
namespacehaar_lib{template<typenameT,typenameFunc=std::plus<T>>std::vector<T>fast_zeta_transform_superset(std::vector<T>f,constFunc&op=std::plus<T>()){constintN=f.size();assert((N&(N-1))==0&&"N must be a power of 2");for(inti=1;i<N;i<<=1){for(intj=0;j<N;++j){if(not(j&i))f[j]=op(f[j],f[j^i]);}}returnf;}}// namespace haar_lib#line 5 "Mylib/Convolution/convolution_and.cpp"
namespacehaar_lib{template<typenameT>std::vector<T>convolution_and(std::vector<T>f,std::vector<T>g){f=fast_zeta_transform_superset(f);g=fast_zeta_transform_superset(g);for(size_ti=0;i<f.size();++i)f[i]*=g[i];f=fast_mobius_transform_superset(f);returnf;}}// namespace haar_lib