結果
| 問題 | No.2577 Simple Permutation Guess | 
| コンテスト | |
| ユーザー |  Rubikun | 
| 提出日時 | 2023-12-05 00:38:45 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 528 ms / 2,000 ms | 
| コード長 | 1,089 bytes | 
| コンパイル時間 | 847 ms | 
| コンパイル使用メモリ | 82,432 KB | 
| 実行使用メモリ | 96,072 KB | 
| 平均クエリ数 | 248.84 | 
| 最終ジャッジ日時 | 2024-09-26 23:45:47 | 
| 合計ジャッジ時間 | 33,832 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 111 | 
ソースコード
import sys
from typing import List
def chmax(a, b):
    if a < b:
        a = b
        return True
    return False
def chmin(a, b):
    if b < a:
        a = b
        return True
    return False
def f(K, N, fac):
    ask = []
    rem = list(range(1, N+1))
    for i in range(N-1, -1, -1):
        po = K // fac[i]
        ask.append(rem[po])
        rem.pop(po)
        K -= fac[i] * po
    print("?", *ask)
    sys.stdout.flush()
    re = int(input())
    return re
def g(K, N, fac):
    ask = []
    rem = list(range(1, N+1))
    for i in range(N-1, -1, -1):
        po = K // fac[i]
        ask.append(rem[po])
        rem.pop(po)
        K -= fac[i] * po
    print("!", *ask)
    sys.stdout.flush()
def main():
    fac = [1] * 405
    for i in range(1, 401):
        fac[i] = fac[i-1] * i
    N = int(input())
    
    left, right = 0, fac[N]
    while right - left > 1:
        mid = (left + right) // 2
        res = f(mid, N, fac)
        if res:
            left = mid
        else:
            right = mid
    
    g(left, N, fac)
if __name__ == "__main__":
    main()
            
            
            
        