更快的 0/1 子集卷积

复杂度为 \(64\times 3^{n-6}\),可以近似为 \(3^n\over 11\)

#include<bits/stdc++.h>
using namespace std;
#include"rd.h"
const int N=1.1e6+5;
int n;
unsigned long long A[64],B[64];
unsigned long long a[N],b[N];
int c[N];
int cnt;
signed main(){
	n=15;
	for(int i=0,x;i<(1<<n);i++) x=0,a[i>>6]|=x*1ull<<(i&63);
	for(int i=0,x;i<(1<<n);i++) x=0,b[i>>6]|=x*1ull<<(63^(i&63));
	for(int i=0;i<64;i++){
		for(int j=0;j<64;j++) if((i&j)==j) A[i]|=1ull<<j,B[i]|=1ull<<(63^j);
	}
	for(int s=0;s<(1<<n);s++){
		int ss=s>>6,t=s&63;
		for(int tt=ss;!c[s];tt=(tt-1)&ss){
			unsigned long long x=a[tt]&A[t],y=b[ss^tt]&B[t];
			c[s]=((x<<(63^t))&y)>0;
			if(!tt) break;
		}
	}
	my_clock();
	// for(int i=0;i<(1<<n);i++) cout<<c[i]<<' ';
	return 0;
}
posted @ 2025-07-16 21:30  born_to_sun  阅读(16)  评论(0)    收藏  举报