Description
This is an interactive problem.
We hid from you a permutation p of length n, consisting of the elements from 1 to n. You want to guess it. To do that, you can give us 2 different indices i and j, and we will reply with pimodpj (remainder of division pi by pj).
We have enough patience to answer at most 2⋅n queries, so you should fit in this constraint. Can you do it?
As a reminder, a permutation of length n is an array consisting of n distinct integers from 1 to n in arbitrary order. For example, [2,3,1,5,4] is a permutation, but [1,2,2] is not a permutation (2 appears twice in the array) and [1,3,4] is also not a permutation (n=3 but there is 4 in the array).
Input
The only line of the input contains a single integer n (1≤n≤104) — length of the permutation.
Interaction
The interaction starts with reading n.
Then you are allowed to make at most 2⋅n queries in the following way:
“? x y” (1≤x,y≤n,x≠y).
After each one, you should read an integer k, that equals pxmodpy.
When you have guessed the permutation, print a single line "! " (without quotes), followed by array p and quit.
After printing a query do not forget to output end of line and flush the output. Otherwise, you will get Idleness limit exceeded. To do this, use:
fflush(stdout) or cout.flush() in C++;
System.out.flush() in Java;
flush(output) in Pascal;
stdout.flush() in Python;
see documentation for other languages.
Exit immediately after receiving “-1” and you will see Wrong answer verdict. Otherwise you can get an arbitrary verdict because your solution will continue to read from a closed stream.
Hack format
In the first line output n (1≤n≤104). In the second line print the permutation of n integers p1,p2,…,pn.
Input
3
1
2
1
0
Output
? 1 2
? 3 2
? 1 3
? 2 1
! 1 3 2
Solution
对于两个正整数
x
,
y
(
x
≠
y
)
x, y ~(x\neq y)
x,y (x=y), 设:
x
%
y
x ~\%~y
x % y
=
=
==
==
m
1
m1
m1
y
%
x
y ~\%~x
y % x
=
=
==
==
m
2
m2
m2
若
m
1
>
m
2
m1 > m2
m1>m2 ,则
x
=
m
1
x = m1
x=m1
若
m
1
<
m
2
m1 < m2
m1<m2, 则
y
=
m
2
y = m2
y=m2
每两次询问可以将两个数中较小值问出,并在此过程中保存当前未知的较大值,继续下次询问
Code
int a[maxn];
void ask(int i,int j) {
cout << "?" << " " << i << " " << j << endl;
fflush(stdout);
}
int main() {
int n;cin >> n;
if(n == 1) {
cout << "! 1" << endl;
fflush(stdout);
exit(0);
}
int id = 0;
int x,y;
ask(1,2);
cin >> x;
ask(2,1);
cin >> y;
if(x > y) {
a[1] = x;
id = 1;
} else {
a[2] = y;
id = 2;
}
if(n == 2) {
if(id == 1) cout << "! " << a[1] << " " << (3 - a[1]) << endl;
else cout << "! " << (3 - a[2]) << " " << a[2] << endl;
fflush(stdout);
return 0;
}
if(id == 1) id = 2; else id = 1;
for(int i = 3;i <= n;++i) {
if(a[i] != 0) continue;
x = 0,y = 0;
ask(id,i);cin >> x;
ask(i,id);cin >> y;
if(x > y) {
a[id] = x;
id = i;
} else {
a[i] = y;
}
}
a[id] = n;
cout << "!";
for(int i = 1;i <= n;++i) {
cout << " " << a[i];
}
cout << endl;
fflush(stdout);
return 0;
}