更快的 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;
}