这题其实就是求自由变量的个数n 然后就有2^n种方法
注意要用到高精度 一开始不知道错在哪 wa了一天 最后得知是高精度的问题...
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
typedef long long ll;
#define exp 1e-8
#define up(i,x,y) for(i=x;i<=y;i++)
#define down(i,x,y) for(i=x;i>=y;i--)
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
const int MAXN=110;
const int mod=1000000007;
const int inf=0x3f3f3f3f;
//对2取模的01方程组
//有equ个方程,var个变元。增广矩阵行数为equ,列数为var+1,分别为0到var
int equ,var;
int a[MAXN][MAXN]; //增广矩阵
int x[MAXN]; //解集
int free_x[MAXN];//用来存储自由变元(多解枚举自由变元可以使用)
int free_num;//自由变元的个数
int n;
//返回值为-1表示无解,为0是唯一解,否则返回自由变元个数
int Gauss()
{
int i,j,k,max_r,col;
free_num=0;
for(k=0,col=0;k<equ&&col<var;k++,col++)
{
max_r=k;
for(i=k+1;i<equ;i++)
{
if(abs(a[i][col])>abs(a[max_r][col]))
max_r=i;
}
if(a[max_r][col]==0)
{
free_x[free_num++] = col;//这个是自由变元
k--;
continue;
}
if(max_r!=k)
{
for(j=col;j<var+1;j++)
{
swap(a[k][j],a[max_r][j]);
}
}
for(i=k+1;i<equ;i++)
{
if(a[i][col]!=0)
{
for(j=col;j<var+1;j++)
{
a[i][j]^=a[k][j];
}
}
}
}
return var-k;
}
int gaojingdu(int n)
{
const int x = 2;//计算x的n次方
int a1[1000] = { 0 };
int b = 0;//用来计算向前 进的数字
a1[999] = 1;
for (int i = 0; i<n; i++){
int j = 999;
while (j >= 0){
int k = a1[j] * x + b;
a1[j] = k % 10;
b = k / 10;
j--;
}
}
int s;
for (s = 0; s<1000; s++){
if (a1[s] != 0)
break;
}
printf("%d",a1[s]);
s++;
for (; s<1000; s++){
printf("%d",a1[s]);
}
printf("\n");
return 1;
}
int main()
{
int T,i,j;
int n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
var=m;
equ=n;
mem(a,0);
mem(x,0);
for(i=0;i<n;i++)
{
scanf("%d",&a[i][m]);
}
for(i=0;i<m;i++)
{
int k,t;
scanf("%d",&k);
while(k--)
{
scanf("%d",&t);
a[t-1][i]=1;
}
}
int tt=Gauss();
if(tt==0)
printf("1\n");
else
gaojingdu(tt);
}
return 0;
}