求助玄学状压代码
查看原帖
求助玄学状压代码
89551
狂拽酷炫吊楼主2020/8/27 12:02

题目大意:共n(n<=1e6)个箱子,m(m<=20)种物品,第i个箱子里有ki种 物品,给出一个物品集合S,求有多少个箱子内的物品是S集合的子集;

主体代码如下,其中cnt数组存的是不同集合时的答案

const int P=1e9+7,M=1e6+5;
int n,B[M],m,k,cnt[M*2];
LL ans;
int main(){
	scanf("%d%d",&n,&m);
	B[0]=1;
	for(int i=1;i<=M-5;++i)B[i]=2ll*B[i-1]%P;
	for(int i=1;i<=n;++i){
		scanf("%d",&k);
		int tmp=0,x;
		while(k--){
			scanf("%d",&x);
			tmp|=B[x-1];
		}
		cnt[tmp]++;
	}
	for(int i=m-1;~i;--i)
        for(int c=0;c<B[m];++c)
            if(c&B[i])cnt[c]+=cnt[c^B[i]];

对于下面这段代码,蒟蒻表示不解。。求证明,谢谢

	for(int i=m-1;~i;--i)
        for(int c=0;c<B[m];++c)
            if(c&B[i])cnt[c]+=cnt[c^B[i]];
2020/8/27 12:02
加载中...