#pragma once
template<classT>voidSupsetZetaTransform(vector<T>&f){intn=f.size();assert((n&(n-1))==0);for(inti=1;i<n;i<<=1)for(intj=0;j<n;j+=i*2)for(intk=0;k<i;k++)f[j+k]+=f[i+j+k];}template<classT>voidSupsetMobiusTransform(vector<T>&f){intn=f.size();assert((n&(n-1))==0);for(inti=1;i<n;i<<=1)for(intj=0;j<n;j+=i*2)for(intk=0;k<i;k++)f[j+k]-=f[i+j+k];}template<classT>voidSubsetZetaTransform(vector<T>&f){intn=f.size();assert((n&(n-1))==0);for(inti=1;i<n;i<<=1)for(intj=0;j<n;j+=i*2)for(intk=0;k<i;k++)f[i+j+k]+=f[j+k];}template<classT>voidSubsetMobiusTransform(vector<T>&f){intn=f.size();assert((n&(n-1))==0);for(inti=1;i<n;i<<=1)for(intj=0;j<n;j+=i*2)for(intk=0;k<i;k++)f[i+j+k]-=f[j+k];}