結果
問題 | No.2719 Equal Inner Products in Permutation |
ユーザー |
|
提出日時 | 2025-02-03 03:31:57 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,959 bytes |
コンパイル時間 | 693 ms |
コンパイル使用メモリ | 81,976 KB |
実行使用メモリ | 100,480 KB |
最終ジャッジ日時 | 2025-02-03 03:32:11 |
合計ジャッジ時間 | 11,295 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 2 WA * 28 |
ソースコード
def even_construct(n): """ n が偶数の場合,長さ 3n の「良い順列」を構成して返す. ここで,n = 2*m とおく. ブロック分割: A = P[0 .. n-1] B = P[n .. 2*n-1] C = P[2*n .. 3*n-1] 以下の式で各ブロックの値を決定する: For i = 0,..., m-1: A[2*i] = 6*m - 2*i , A[2*i+1] = 2*i + 1 B[2*i] = 4*m - 2*i , B[2*i+1] = 2*i + 2 C[2*i] = 6*m - 2*i - 1 , C[2*i+1] = 4*m - 2*i - 1 """ m = n // 2 size = 3 * n P = [0] * size # ブロック A: indices 0 .. n-1 (計 n = 2*m 項) for i in range(m): P[2*i] = 6 * m - 2 * i # i=0: 6*m, i= m-1: 6*m -2*(m-1) P[2*i + 1] = 2 * i + 1 # ブロック B: indices n .. 2*n-1 for i in range(m): P[n + 2*i] = 4 * m - 2 * i P[n + 2*i + 1] = 2 * i + 2 # ブロック C: indices 2*n .. 3*n-1 for i in range(m): P[2*n + 2*i] = 6 * m - 2 * i - 1 P[2*n + 2*i + 1] = 4 * m - 2 * i - 1 return P def odd_construct(n): """ n が奇数かつ n>=3 のときの「良い順列」を構成する. n = (N-3) + 3 と見て, - 偶数部分:サイズ M = n - 3 (M は偶数)に対して even_construct(M) - 3 部分:既知の N=3 の良い順列 S3 = [1,2,8,3,6,9,7,5,4] に オフセット offset = 3*M を加えたもの それぞれをブロック毎に連結して,全体の順列(長さ 3n)を作る. """ M = n - 3 # M は偶数(n>=3 なので M>=0) # 偶数部分(M==0 のときは空リスト) if M > 0: P_even = even_construct(M) # 長さ 3*M else: P_even = [] # N=3 用の固定良い順列(ブロック毎に 3 項ずつ) S3 = [1, 2, 8, 3, 6, 9, 7, 5, 4] offset = 3 * M S3_offset = [x + offset for x in S3] # 偶数部分はブロック分けされている: # A_even = P_even[0:M] # B_even = P_even[M:2*M] # C_even = P_even[2*M:3*M] # 同様に S3_offset は,先頭 3 項が A3, 次の 3 項が B3, 最後の 3 項が C3 A_even = P_even[0:M] if M > 0 else [] B_even = P_even[M:2*M] if M > 0 else [] C_even = P_even[2*M:3*M] if M > 0 else [] A3 = S3_offset[0:3] B3 = S3_offset[3:6] C3 = S3_offset[6:9] A_total = A_even + A3 B_total = B_even + B3 C_total = C_even + C3 # 連結して全体の順列を作る return A_total + B_total + C_total def solve(): import sys input_line = sys.stdin.readline().strip() if not input_line: return N = int(input_line) # N=1 のときは解が存在しない if N == 1: print(-1) return # N >= 2 のとき if N % 2 == 0: P = even_construct(N) else: P = odd_construct(N) # 出力(空白区切り) print(" ".join(map(str, P))) if __name__ == '__main__': solve()