题目大意:共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]];