結果
問題 | No.2496 LCM between Permutations |
ユーザー |
![]() |
提出日時 | 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 sysinput = sys.stdin.readlinefrom math import lcmfrom collections import Counterx=1005L=35Primelist=[i for i in range(x+1)]Primelist[1]=0 # 1は素数でないので0にする.for i in Primelist:if i>L:breakif i==0:continuefor j in range(2*i,x+1,i):Primelist[j]=0N=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]=xLIST[j][i]=xSORTED=[[] 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]=-1B[0]=-1for i in range(1,N+1):print("?",1,i,flush=True)x=int(input())DATA[1][i]=xAS=sorted(DATA[1])for i in range(1,N+1):if SORTED[i]==AS:A[1]=ibreakC=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]]=ifor i in range(1,N+1):if DATA[1][i] in D:B[i]=D[DATA[1][i]]#print(A)#print(B)P=0ind=-1for i in range(1,N+1):if B[i]==1:P=1ind=ibreakif B[i]!=0 and Primelist[B[i]]!=0:if P<B[i]:P=B[i]ind=iif 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]]=ifor i in range(1,N+1):if A[i]!=0:continueprint("?",i,ind,flush=True)x=int(input())DATA[1][i]=xif 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]+=1for i in range(1,N+1):if USE[i]==0:sore=ifor i in range(1,N+1):if A[i]==0:A[i]=soreif 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]]+=1REST=[]for i in range(1,N+1):if USE[i]==0:REST.append(i)REST.sort()oneflag=0ind=IND[0]for i in range(1,N+1):if B[i]!=0:continueprint("?",ind,i,flush=True)x=int(input())if x==1:oneflag=1DATA[ind][i]=xif oneflag==1:A[ind]=1A[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]]=1C=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:continueprint("?",i,ind,flush=True)x=int(input())DATA[ind][i]=xA[i]=xif B.count(0)==1:ind=B.index(0)USE=[0]*(N+1)for b in B:USE[b]+=1for i in range(1,N+1):if USE[i]==0:sore=ifor i in range(1,N+1):if B[i]==0:B[i]=soreif 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]]+=1REST=[]for i in range(1,N+1):if USE[i]==0:REST.append(i)REST.sort()oneflag=0ind=IND[0]for i in range(1,N+1):if A[i]!=0:continueprint("?",i,ind,flush=True)x=int(input())if x==1:oneflag=1DATA[i][ind]=xif oneflag==1:B[ind]=1B[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]]=1C=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:continueprint("?",i,ind,flush=True)x=int(input())DATA[i][ind]=xA[i]=xANS=A[1:]+B[1:]print("!",*ANS,flush=True)