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
思路如下:由于可以查询 2*n 次,所以最少两次询问要确定一个数。每次询问是做模运算,很容易想到小数模大数就是它本身。所以两次一定可以确定哪个是小数
int n; cin >> n; int tmp = 1; rep(i, 2, n){ int q, p; cout <<"? " << tmp << " " << i << endl; cin >> q; cout << "? " << i << " " << tmp << endl; cin >> p; if(q < p) { a[i] = p; } else { a[tmp]=q, tmp=i; } } a[tmp] = n; cout << "!"; rep(i, 1, n){ cout << " " << a[i]; } cout << endl; return 0;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)