結果

問題 No.1566 All Even
ユーザー qwewe
提出日時 2025-05-14 13:26:48
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 6,742 bytes
コンパイル時間 769 ms
コンパイル使用メモリ 90,436 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2025-05-14 13:27:35
合計ジャッジ時間 1,695 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 18 WA * 10
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <string>
#include <numeric>
#include <algorithm>
#include <set>
#include <vector>
#include <bitset>
#include <tuple> // Required for std::tuple

// Max variables for Gaussian elimination (k)
// For N=1, k=1. For N=2, k=3. For N=3, k=3.
const int MAX_VARS_GAUSS = 3; 

// Solves a system of linear equations over GF(2)
// equations_list is a vector of pairs (mask, value)
// mask indicates which variables are summed (e.g., mask 7 for X0+X1+X2), value is the RHS
// k is the number of variables
long long solve_gf2_system(std::vector<std::pair<int, int>>& equations_list, int k) {
    if (k == 0) { 
        // This case occurs if N>=4 where variables are fixed (all 1s).
        // equations_list would check consistency.
        // e.g. 0 = 1 means contradiction.
        for (const auto& eq : equations_list) {
             // For N>=4, all variables are fixed to 1. Any constraint effectively becomes
             // a fixed value = z_i. So if this function were called for N>=4, k=0 means no free variables.
             // An equation like 0=1 (from 1=0) would mean 0 solutions.
             // This part of logic is simplified as N>=4 is handled before calling this.
            if (eq.first == 0 && eq.second == 1) return 0;
        }
        return 1;
    }

    std::vector<std::bitset<MAX_VARS_GAUSS + 1>> A; // Store augmented matrix
    for (const auto& eq_pair : equations_list) {
        std::bitset<MAX_VARS_GAUSS + 1> row;
        // Fill variable coefficients
        for (int i = 0; i < k; ++i) {
            if ((eq_pair.first >> i) & 1) {
                row[i] = 1;
            }
        }
        // Fill constant term (RHS)
        row[k] = eq_pair.second;
        A.push_back(row);
    }

    int num_equations = A.size();
    int pivot_row = 0; 
    // Gaussian elimination
    for (int col = 0; col < k && pivot_row < num_equations; ++col) {
        int sel_row = pivot_row;
        // Find a row with 1 in current column at or below pivot_row
        while (sel_row < num_equations && A[sel_row][col] == 0) {
            sel_row++;
        }

        if (sel_row < num_equations) { // If pivot found
            std::swap(A[pivot_row], A[sel_row]); // Move pivot row to pivot_row
            // Eliminate other 1s in this column by XORing with pivot_row
            for (int r = 0; r < num_equations; ++r) {
                if (r != pivot_row && A[r][col] == 1) {
                    A[r] ^= A[pivot_row]; 
                }
            }
            pivot_row++; // Increment pivot_row counter (this is also current rank)
        }
    }

    int rank = pivot_row; // Rank is the number of pivots found

    // Check for inconsistencies (0 = 1) in rows below pivots
    for (int i = rank; i < num_equations; ++i) {
        // A[i] has all zeros on variable side. If A[i][k] (RHS) is 1, it's 0 = 1.
        if (A[i][k] == 1) { 
            return 0; // Inconsistent system
        }
    }
    
    // Number of solutions is 2^(number of variables - rank)
    return 1LL << (k - rank);
}


int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    int N_in, M_in;
    std::cin >> N_in >> M_in;

    std::vector<std::tuple<int, int, int>> constraints(M_in);
    for (int i = 0; i < M_in; ++i) {
        std::cin >> std::get<0>(constraints[i]) >> std::get<1>(constraints[i]) >> std::get<2>(constraints[i]);
    }

    if (N_in >= 4) {
        bool possible = true;
        for (int i = 0; i < M_in; ++i) {
            // For N>=4, all a_ij must be 1. So z_i must be 1.
            if (std::get<2>(constraints[i]) == 0) {
                possible = false;
                break;
            }
        }
        if (possible) {
            std::cout << 1 << std::endl;
        } else {
            std::cout << 0 << std::endl;
        }
        return 0;
    }

    std::vector<std::pair<int, int>> equations_list;
    int k_vars = 0;

    if (N_in == 1) {
        k_vars = 1; // Variable X_0 = a_1,1
        for (int i = 0; i < M_in; ++i) {
            // Constraint a_x,y = z becomes a_1,1 = z (since x=1,y=1 for N=1)
            // Equation: X_0 = z. Mask for X_0 is (1 << 0) = 1.
            equations_list.push_back({(1 << 0), std::get<2>(constraints[i])});
        }
    } else if (N_in == 2) {
        k_vars = 3; // Variables: X_0=a_1,1, X_1=a_1,2, X_2=a_2,1
        for (int i = 0; i < M_in; ++i) {
            int r = std::get<0>(constraints[i]);
            int c = std::get<1>(constraints[i]);
            int val = std::get<2>(constraints[i]);
            if (r == 1 && c == 1) { // a_1,1 = val  => X_0 = val
                equations_list.push_back({(1 << 0), val}); 
            } else if (r == 1 && c == 2) { // a_1,2 = val => X_1 = val
                equations_list.push_back({(1 << 1), val}); 
            } else if (r == 2 && c == 1) { // a_2,1 = val => X_2 = val
                equations_list.push_back({(1 << 2), val}); 
            } else if (r == 2 && c == 2) { // a_2,2 = val. And a_2,2 = X_0+X_1+X_2. So X_0+X_1+X_2 = val
                equations_list.push_back({(1 << 0) | (1 << 1) | (1 << 2), val}); 
            }
        }
    } else if (N_in == 3) {
        k_vars = 3; // Variables: X_0=a_1,1, X_1=a_2,1, X_2=a_1,2
        // Intrinsic equation from structure of N=3 matrices: X_0 + X_1 + X_2 = 1
        equations_list.push_back({(1 << 0) | (1 << 1) | (1 << 2), 1}); 

        for (int i = 0; i < M_in; ++i) {
            int r = std::get<0>(constraints[i]);
            int c = std::get<1>(constraints[i]);
            int val = std::get<2>(constraints[i]);

            // Mapping (r,c) to expressions in X_0, X_1, X_2 for N=3 case:
            // a_1,1=X_0, a_1,2=X_2, a_1,3=X_0
            // a_2,1=X_1, a_2,2=1,   a_2,3=X_1
            // a_3,1=X_0, a_3,2=X_2, a_3,3=X_0
            if ((r == 1 && c == 1) || (r == 1 && c == 3) || (r == 3 && c == 1) || (r == 3 && c == 3)) {
                // This cell value is X_0. So X_0 = val.
                equations_list.push_back({(1 << 0), val});
            } else if ((r == 2 && c == 1) || (r == 2 && c == 3)) {
                // This cell value is X_1. So X_1 = val.
                equations_list.push_back({(1 << 1), val});
            } else if ((r == 1 && c == 2) || (r == 3 && c == 2)) {
                // This cell value is X_2. So X_2 = val.
                equations_list.push_back({(1 << 2), val});
            } else if (r == 2 && c == 2) {
                // This cell value is 1 (from template). So 1 = val.
                // This is equivalent to 0 = val XOR 1.
                equations_list.push_back({0, (val ^ 1)});
            }
        }
    }
    
    std::cout << solve_gf2_system(equations_list, k_vars) << std::endl;

    return 0;
}
0