首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

HDU 3364 Lanterns:高斯消元解 XOR 方程組(開關燈問題)

     編輯:關於C++

問題描述

n 盞燈,m 個開關。每個開關控制某些燈(按下翻轉狀態)。q 次詢問,每次給定目標燈狀態(0/1),求從全滅到達目標的開關按法數(每開關最多按一次)。模數無,答案為 2 的冪次。

線性代數建模 (GF(2))

  • 變量 x_j ∈ {0,1} 表示開關 j 是否按下。
  • 方程:對每盞燈 i,Σ (a_ij * x_j) ≡ target_i (mod 2),其中 a_ij=1 若開關 j 控制燈 i。
  • 增廣矩陣 [A | b],A 為 n×m,b 為目標向量。

高斯消元 (異或消元)

long long gauss(int mat[][N], int row, int col) {
    int r, c;
    for (r=c=0; r

完整流程

  1. 讀入開關-燈關係,構建係數矩陣 init[n][m]。
  2. 每次詢問複製 init 到 mat,填入目標向量最後一列。
  3. 高斯消元得自由度 f,答案 2^f(用 BigInteger 或位運算,題目保證 64 位足夠)。

Java 實現要點

  • 用 int[][] 存儲 0/1,異或操作 ^=。
  • 答案可能很大,用 BigInteger 輸出。
  • 矩陣行列互換不影響解空間維數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved