#P11818. [PA 2019 Final] 一安在? / Gdzie jest jedynka? 2

    ID: 13085 远端评测题 3000ms 512MiB 尝试: 0 已通过: 0 难度: 5 上传者: 标签>2019交互题Special Judge最大公约数 gcdAd-hocPA(波兰)

[PA 2019 Final] 一安在? / Gdzie jest jedynka? 2

题目背景

请使用 C++14 或者更高的版本提交,否则不保证可以编译成功。

本题数据为自造。交互库疑似有点弱,欢迎加强。

  • std: KanameMadoka & Wuyanru;
  • interactor:KanameMadoka & Starrykiller;
  • validator & generator:Starrykiller;
  • special thanks to FFTotoro。

本题 #2#7\texttt{\#2}\sim\texttt{\#7} 为长度为 383\sim 8 的全排列,在这几个测试点中交互库是不自适应的。

题目描述

这是一道交互题。 本题中,交互库是自适应的

有一个隐藏的 0n10\sim n-1 的排列 p0,p1,,pn1p_0,p_1,\cdots,p_{n-1}

你可以询问至多 5n2\lceil\frac{5n}{2}\rceil 次:每次询问给定 i,ji,jiji\neq j),交互库会返回 gcd(pi,pj)\gcd(p_{i},p_j) 的值。特别地,定义 gcd(0,a)=gcd(a,0)=a\gcd(0,a)=\gcd(a,0)=a

找到这个排列中 11 的位置。也就是,找到 jj,使得 pj=1p_j=1

实现细节

本题单个测试点内有多组测试数据。

你不需要,也不应该实现 main 函数。

你需要在文件头加入以下内容:

int ask(int, int);

你应该实现以下的函数:

  • int solve(int n):处理一组排列长度为 nn 的数据。
    • 返回一个非负整数 jj 满足 pj=1p_j=1。你需要保证 0j<n0\le j\lt n,且 pj=1p_j=1

实际测评时将会多次调用 solve 函数。

你可以调用以下的函数:

  • int ask(int i, int j):询问 gcd(pi,pj)\gcd(p_i,p_j)
    • 你需要保证 0i,j<n0\le i,j\lt n,且 iji\neq j

需要注意的是,交互库是自适应的,也就是,交互库会根据你的询问(在不矛盾的前提下)动态调整答案。

输入格式

见【实现细节】。

输出格式

见【实现细节】。

输入数据 1

1
5

1

2

3

输出数据 1



? 1 4

? 1 0

? 2 3

! 3

提示

样例交互

设原序列为 [4,2,0,3,1][4,2,0,3,1]

交互库 选手程序
调用 solve(5)\operatorname{solve}(5)
返回 gcd(p1,p4)=1\gcd(p_1,p_4)=1 调用 ask(1,4)\operatorname{ask}(1,4)
返回 gcd(p1,p0)=2\gcd(p_1,p_0)=2 调用 ask(1,0)\operatorname{ask}(1,0)
返回 gcd(p2,p3)=3\gcd(p_2,p_3)=3 调用 ask(2,3)\operatorname{ask}(2,3)
p4=1p_4=1,判定为 Accepted 返回 44

需要注意的是,样例交互仅为交互格式示意,不代表根据这些信息能唯一确定答案。 交互库是自适应的。


数据范围

  • 3n,n5×1053\le n,\sum n\le 5\times 10^5

再次提醒,交互库是自适应的