結果
| 問題 | 
                            No.1056 2D Lamps
                             | 
                    
| コンテスト | |
| ユーザー | 
                             gew1fw
                         | 
                    
| 提出日時 | 2025-06-12 19:27:47 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,543 bytes | 
| コンパイル時間 | 168 ms | 
| コンパイル使用メモリ | 82,228 KB | 
| 実行使用メモリ | 52,352 KB | 
| 最終ジャッジ日時 | 2025-06-12 19:27:53 | 
| 合計ジャッジ時間 | 5,522 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | TLE * 1 -- * 13 | 
ソースコード
def main():
    import sys
    input = sys.stdin.read().split()
    idx = 0
    N = int(input[idx])
    idx += 1
    M = int(input[idx])
    idx += 1
    # Read M configurations
    configurations = []
    for _ in range(M):
        vec = 0
        for i in range(N):
            line = input[idx]
            idx += 1
            for j in range(N):
                if line[j] == '#':
                    pos = i * N + j
                    vec |= (1 << pos)
        configurations.append(vec)
    # Generate all operation vectors
    op_vectors = []
    # Rows
    for k in range(1, N + 1):
        vec = 0
        for j in range(N):
            pos = (k - 1) * N + j
            vec |= (1 << pos)
        op_vectors.append(vec)
    # Columns
    for k in range(1, N + 1):
        vec = 0
        for i in range(N):
            pos = i * N + (k - 1)
            vec |= (1 << pos)
        op_vectors.append(vec)
    # Diagonals i + j = s, for s in 0..2N-2
    for s in range(0, 2 * N - 1):
        vec = 0
        for i in range(N):
            j = s - i
            if 0 <= j < N:
                pos = i * N + j
                vec |= (1 << pos)
        op_vectors.append(vec)
    # Anti-diagonals j - i = t, for t in -(N-1) to N-1
    for t in range(-(N - 1), N):
        vec = 0
        for i in range(N):
            j = i + t
            if 0 <= j < N:
                pos = i * N + j
                vec |= (1 << pos)
        op_vectors.append(vec)
    # Perform Gaussian elimination to find the basis
    basis = {}
    for vec in op_vectors:
        current = vec
        while True:
            if current == 0:
                break
            highest_bit = current.bit_length() - 1
            if highest_bit not in basis:
                basis[highest_bit] = current
                break
            else:
                current ^= basis[highest_bit]
    # Sort basis keys in descending order
    basis_keys = sorted(basis.keys(), reverse=True)
    # Prepare the result
    result = []
    for i in range(M - 1):
        line = []
        for j in range(i + 1, M):
            D = configurations[i] ^ configurations[j]
            current = D
            for bit in basis_keys:
                if (current >> bit) & 1:
                    current ^= basis[bit]
            if current == 0:
                line.append('1')
            else:
                line.append('0')
        result.append(''.join(line))
    # Print the result
    for line in result:
        print(line)
if __name__ == "__main__":
    main()
            
            
            
        
            
gew1fw