FZU_1704
在转化成同余方程组后需要确定变元的个数n,由于变元一旦确定就可以唯一确定一种方案,所以最后的方案种数就2^n,而变元的个数n就是M减去矩阵的秩。
import java.math.BigInteger; import java.util.Scanner; public class Main { static int N, M; static int[][] mat = new int[110][110]; static Scanner cin = new Scanner(System.in); public static void main(String[] args) { int t = cin.nextInt(); while(t != 0) { -- t; init(); BigInteger ans = gauss(); System.out.println(ans); } } static void init() { int i, j, k, n; N = cin.nextInt(); M = cin.nextInt(); for(i = 0; i < N; i ++) for(j = 0; j <= M; j ++) mat[i][j] = 0; for(i = 0; i < N; i ++) mat[i][M] = cin.nextInt(); for(i = 0; i < M; i ++) { n = cin.nextInt(); for(j = 0; j < n; j ++) { k = cin.nextInt(); mat[k - 1][i] = 1; } } } static BigInteger gauss() { int i, j, x, y, t; for(i = j = 0; i < N && j < M; i ++, j ++) { if(mat[i][j] == 0) { for(x = i + 1; x < N; x ++) if(mat[x][j] == 1) { for(y = j; y <= M; y ++) { t = mat[i][y]; mat[i][y] = mat[x][y]; mat[x][y] = t; } break; } if(x == N) { -- i; continue; } } for(x = i + 1; x < N; x ++) if(mat[x][j] == 1) { for(y = j; y <= M; y ++) mat[x][y] ^= mat[i][y]; } } BigInteger ans = new BigInteger("2"); ans = ans.pow(M - i); return ans; } }