​https://acm.hdu.edu.cn/showproblem.php?pid=3364​

 

题意:

n个灯被m个开关连锁控制,问有多少种打开开关的方案,使灯的亮暗满足要求

 

高斯消元解异或方程组裸题

注意这里使n个方程m个未知数。

注意判断无解,即 系数全0行的常数列为1则无解

答案是2^(自由元个数)

 

#include<bits/stdc++.h>

using namespace std;

#define N 55

bitset<N>b[N],c[N];

int n,m;

long long gauss()
{
int j,row=0;
for(int i=0;i<m;++i)
{
j=row;
while(j<n && !b[j][i]) ++j;
if(j==n) continue;
swap(b[row],b[j]);
for(int k=row+1;k<n;++k)
if(b[k][i]) b[k]^=b[row];
++row;
}
for(int i=row;i<n;++i)
if(b[i].test(m)) return 0;
return 1ll<<(m-row);
}

int main()
{
int T,k,x,q;
scanf("%d",&T);
for(int t=1;t<=T;++t)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i) c[i].reset();
for(int i=0;i<m;++i)
{
scanf("%d",&k);
while(k--)
{
scanf("%d",&x);
c[x-1].set(i);
}
}
scanf("%d",&q);
printf("Case %d:\n",t);
while(q--)
{
for(int i=0;i<n;++i) b[i]=c[i];
for(int i=0;i<n;++i)
{
scanf("%d",&x);
if(x) b[i].set(m);
else b[i].reset(m);
}
printf("%lld\n",gauss());
}
}
}

 

作者:​​xxy​