T575007 「PA Mashup #2」一安在?
题目背景
**请使用 C++14 或者更高的版本提交,否则不保证可以编译成功。**
题目描述
**这是一道交互题。** 本题中,**交互库是自适应的**。
有一个**隐藏的** $0\sim n-1$ 的排列 $p_0,p_1,\cdots,p_{n-1}$。
你可以询问至多 $\lceil\frac{5n}{2}\rceil$ 次:每次询问给定 $i,j$($i\neq j$),交互库会返回 $\gcd(p_{i},p_j)$ 的值。特别地,定义 $\gcd(0,a)=\gcd(a,0)=a$。
找到这个排列中 $1$ 的位置。也就是,找到 $j$,使得 $p_j=1$。
### 实现细节
**本题单个测试点内有多组测试数据。**
你不需要,也不应该实现 `main` 函数。
你需要在文件头加入以下内容:
```cpp
int ask(int, int);
```
你应该实现以下的函数:
- `int solve(int n)`:处理一组排列长度为 $n$ 的数据。
- 返回一个非负整数 $j$ 满足 $p_j=1$。你需要保证 $0\le j\lt n$,且 $p_j=1$。
实际测评时将会多次调用 `solve` 函数。
你可以调用以下的函数:
- `int ask(int i, int j)`:询问 $\gcd(p_i,p_j)$。
- 你需要保证 $0\le i,j\lt n$,且 $i\neq j$。
- 每组数据至多只能调用 $\lceil\frac{5n}{2}\rceil$ 次。
需要注意的是,**交互库是自适应的**,也就是,交互库会根据你的询问(在不矛盾的前提下)动态调整答案。
输入格式
无
输出格式
无
说明/提示
### 样例交互
设原序列为 $[4,2,0,3,1]$。
| 交互库 | 选手程序 |
| :--: | :--: |
| 调用 $\operatorname{solve}(5)$ | |
| 返回 $\gcd(p_1,p_4)=1$ | 调用 $\operatorname{ask}(1,4)$ |
| 返回 $\gcd(p_1,p_0)=2$ | 调用 $\operatorname{ask}(1,0)$ |
| 返回 $\gcd(p_2,p_3)=3$ | 调用 $\operatorname{ask}(2,3)$ |
| $p_4=1$,判定为 Accepted | 返回 $4$ |
需要注意的是,**样例交互仅为交互格式示意,不代表根据这些信息能唯一确定答案。** 交互库是自适应的。
---
### 数据范围
- $3\le n,\sum n\le 5\times 10^5$。
再次提醒,**交互库是自适应的**。