結果

問題 No.1907 DETERMINATION
ユーザー gew1fw
提出日時 2025-06-12 13:19:49
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 2,678 bytes
コンパイル時間 530 ms
コンパイル使用メモリ 82,280 KB
実行使用メモリ 119,624 KB
最終ジャッジ日時 2025-06-12 13:22:12
合計ジャッジ時間 7,347 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 3 TLE * 1 -- * 59
権限があれば一括ダウンロードができます

ソースコード

diff #

mod = 998244353

def main():
    import sys
    input = sys.stdin.read().split()
    ptr = 0
    n = int(input[ptr])
    ptr += 1
    
    m0 = []
    for _ in range(n):
        row = list(map(int, input[ptr:ptr+n]))
        ptr += n
        m0.append(row)
    
    m1 = []
    for _ in range(n):
        row = list(map(int, input[ptr:ptr+n]))
        ptr += n
        m1.append(row)
    
    # Choose n+1 distinct points, x = 0, 1, ..., n
    points = list(range(n+1))
    y = []
    for x in points:
        mat = []
        for i in range(n):
            row = [(m0[i][j] + x * m1[i][j]) % mod for j in range(n)]
            mat.append(row.copy())
        
        det_val = 1
        for i in range(n):
            pivot = -1
            for j in range(i, n):
                if mat[j][i] != 0:
                    pivot = j
                    break
            if pivot == -1:
                det_val = 0
                break
            if pivot != i:
                mat[i], mat[pivot] = mat[pivot], mat[i]
                det_val = (-det_val) % mod
            inv = pow(mat[i][i], mod-2, mod)
            det_val = (det_val * mat[i][i]) % mod
            for j in range(i+1, n):
                factor = (mat[j][i] * inv) % mod
                for k in range(i, n):
                    mat[j][k] = (mat[j][k] - factor * mat[i][k]) % mod
        y.append(det_val)
    
    # Lagrange interpolation
    coeff = [0]*(n+1)
    for i in range(n+1):
        xi = points[i]
        yi = y[i]
        
        # Compute Lagrange basis polynomial L_i(x)
        numerator = [1]  # product (x - xj) for j != i
        for j in range(n+1):
            if j == i:
                continue
            term = [-points[j], 1]  # x - xj
            new_num = [0]*(len(numerator)+1)
            for a in range(len(numerator)):
                for b in range(len(term)):
                    new_num[a+b] = (new_num[a+b] + numerator[a] * term[b]) % mod
            numerator = new_num
        
        # Compute denominator: product (xi - xj) for j != i
        denominator = 1
        for j in range(n+1):
            if j != i:
                denominator = denominator * (xi - points[j]) % mod
        inv_denominator = pow(denominator, mod-2, mod)
        
        # Multiply numerator by inv_denominator and yi
        for k in range(len(numerator)):
            numerator[k] = numerator[k] * inv_denominator % mod
            numerator[k] = numerator[k] * yi % mod
        
        # Add to coefficients
        for k in range(len(numerator)):
            coeff[k] = (coeff[k] + numerator[k]) % mod
    
    for c in coeff:
        print(c)

if __name__ == "__main__":
    main()
0