:warning: math/or_convolution.hpp

Code

template<typename T>
vector<T> or_conv(vector<T>s,vector<T>t,int n){
	auto zeta=[](vector<T>& f,int n){
		for(int i=0;i<n;++i){
			for(int j=0;j<(1<<n);++j){
				if((j&(1<<i))==0)f[j^(1<<i)]+=f[j];
			}
		}
	};
	auto mebius=[](vector<T>& f,int n){
		for(int i=0;i<n;++i){
			for(int j=0;j<(1<<n);++j){
				if((j&(1<<i))==0)f[j^(1<<i)]-=f[j];
			}
		}
	};
	zeta(s,n);
	zeta(t,n);
	for(int i=0;i<(1<<n);++i)s[i]*=t[i];
	mebius(s,n);
	return s;
}
#line 1 "math/or_convolution.hpp"
template<typename T>
vector<T> or_conv(vector<T>s,vector<T>t,int n){
	auto zeta=[](vector<T>& f,int n){
		for(int i=0;i<n;++i){
			for(int j=0;j<(1<<n);++j){
				if((j&(1<<i))==0)f[j^(1<<i)]+=f[j];
			}
		}
	};
	auto mebius=[](vector<T>& f,int n){
		for(int i=0;i<n;++i){
			for(int j=0;j<(1<<n);++j){
				if((j&(1<<i))==0)f[j^(1<<i)]-=f[j];
			}
		}
	};
	zeta(s,n);
	zeta(t,n);
	for(int i=0;i<(1<<n);++i)s[i]*=t[i];
	mebius(s,n);
	return s;
}
Back to top page