FZU 1704 Turn off the light

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;

    }

}

你可能感兴趣的:(li)