結果
| 問題 | No.2496 LCM between Permutations | 
| コンテスト | |
| ユーザー |  titia | 
| 提出日時 | 2023-10-10 03:59:14 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 392 ms / 2,000 ms | 
| コード長 | 4,820 bytes | 
| コンパイル時間 | 316 ms | 
| コンパイル使用メモリ | 82,320 KB | 
| 実行使用メモリ | 117,868 KB | 
| 平均クエリ数 | 775.00 | 
| 最終ジャッジ日時 | 2024-09-13 00:13:09 | 
| 合計ジャッジ時間 | 6,699 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 28 | 
ソースコード
import sys
input = sys.stdin.readline
from math import lcm
from collections import Counter
x=1005
L=35
Primelist=[i for i in range(x+1)]
Primelist[1]=0 # 1は素数でないので0にする.
 
for i in Primelist:
    if i>L:
        break
    if i==0:
        continue
    for j in range(2*i,x+1,i):
        Primelist[j]=0
N=int(input())
LIST=[[0]*(N+1) for i in range(N+1)]
for i in range(1,N+1):
    for j in range(1,N+1):
        x=lcm(i,j)
        LIST[i][j]=x
        LIST[j][i]=x
SORTED=[[] for i in range(N+1)]
for i in range(N+1):
    SORTED[i]=sorted(LIST[i])
DATA=[[0]*(N+1) for i in range(N+1)]
A=[0]*(N+1)
B=[0]*(N+1)
A[0]=-1
B[0]=-1
for i in range(1,N+1):
    print("?",1,i,flush=True)
    x=int(input())
    DATA[1][i]=x
AS=sorted(DATA[1])
for i in range(1,N+1):
    if SORTED[i]==AS:
        A[1]=i
        break
C=Counter(LIST[A[1]])
D=dict()
for i in range(1,N+1):
    if C[LIST[A[1]][i]]==1:
         D[LIST[A[1]][i]]=i
for i in range(1,N+1):
    if DATA[1][i] in D:
        B[i]=D[DATA[1][i]]
#print(A)
#print(B)
P=0
ind=-1
for i in range(1,N+1):
    if B[i]==1:
        P=1
        ind=i
        break
    if B[i]!=0 and Primelist[B[i]]!=0:
        if P<B[i]:
            P=B[i]
            ind=i
if ind!=-1:
    C=Counter(LIST[B[ind]])
    D=dict()
    for i in range(1,N+1):
        if C[LIST[B[ind]][i]]==1:
             D[LIST[B[ind]][i]]=i
             
    for i in range(1,N+1):
        if A[i]!=0:
            continue
        print("?",i,ind,flush=True)
        x=int(input())
        DATA[1][i]=x
        if P!=1:
            if x in D:
                A[i]=D[x]
        else:
            A[i]=x
#print(A)
#print(B)
if A.count(0)==1:
    ind=A.index(0)
    USE=[0]*(N+1)
    for a in A:
        USE[a]+=1
    for i in range(1,N+1):
        if USE[i]==0:
            sore=i
    for i in range(1,N+1):
        if A[i]==0:
            A[i]=sore
            
if A.count(0)==2:
    IND=[]
    USE=[0]*(N+1)
    for i in range(1,N+1):
        if A[i]==0:
            IND.append(i)
        else:
            USE[A[i]]+=1
    REST=[]
    for i in range(1,N+1):
        if USE[i]==0:
            REST.append(i)
    REST.sort()
    oneflag=0
    ind=IND[0]
    for i in range(1,N+1):
        if B[i]!=0:
            continue
        print("?",ind,i,flush=True)
        x=int(input())
        if x==1:
            oneflag=1
        DATA[ind][i]=x
    if oneflag==1:
        A[ind]=1
        A[IND[1]]=REST[1]
        for i in range(1,N+1):
            if B[i]==0:
                B[i]=DATA[ind][i]
    else:
        A[ind]=REST[1]
        A[IND[1]]=1
        C=Counter(LIST[A[ind]])
        D=dict()
        for i in range(1,N+1):
            if C[LIST[A[ind]][i]]==1:
                 D[LIST[A[ind]][i]]=i
        #print(D)
                 
        for i in range(1,N+1):
            if B[i]==0:
                if DATA[ind][i] in D:
                    B[i]=D[DATA[ind][i]]
#print(A)
#print(B)
                     
        
if B.count(0)==0:
    ind=B.index(1)
    for i in range(1,N+1):
        if A[i]!=0:
            continue
        print("?",i,ind,flush=True)
        x=int(input())
        DATA[ind][i]=x
        A[i]=x
if B.count(0)==1:
    ind=B.index(0)
    USE=[0]*(N+1)
    for b in B:
        USE[b]+=1
    for i in range(1,N+1):
        if USE[i]==0:
            sore=i
    for i in range(1,N+1):
        if B[i]==0:
            B[i]=sore
            
if B.count(0)==2:
    IND=[]
    USE=[0]*(N+1)
    for i in range(1,N+1):
        if B[i]==0:
            IND.append(i)
        else:
            USE[B[i]]+=1
    REST=[]
    for i in range(1,N+1):
        if USE[i]==0:
            REST.append(i)
    REST.sort()
    oneflag=0
    ind=IND[0]
    for i in range(1,N+1):
        if A[i]!=0:
            continue
        print("?",i,ind,flush=True)
        x=int(input())
        if x==1:
            oneflag=1
        DATA[i][ind]=x
    if oneflag==1:
        B[ind]=1
        B[IND[1]]=REST[1]
        for i in range(1,N+1):
            if A[i]==0:
                A[i]=DATA[i][ind]
    else:
        B[ind]=REST[1]
        B[IND[1]]=1
        C=Counter(LIST[B[ind]])
        D=dict()
        for i in range(1,N+1):
            if C[LIST[B[ind]][i]]==1:
                 D[LIST[B[ind]][i]]=i
        #print(D)
                 
        for i in range(1,N+1):
            if A[i]==0:
                if DATA[i][ind] in D:
                    A[i]=D[DATA[i][ind]]
#print(A)
#print(B)
                     
        
if B.count(0)==0:
    ind=B.index(1)
    for i in range(1,N+1):
        if A[i]!=0:
            continue
        print("?",i,ind,flush=True)
        x=int(input())
        DATA[i][ind]=x
        A[i]=x
ANS=A[1:]+B[1:]
print("!",*ANS,flush=True)
        
            
        
           
           
            
            
            
        