T715247 [CFCOI-R4-T3] 最短路查询

题目背景

$\text{path.cpp},1 \text{ s},512 \text{ MiB}$ -------------- **这是一道交互题。** 你可以在下面示例程序中编辑: ```cpp #include using namespace std; extern "C" long long query(int x); extern "C" int solve(int n){ return -1; } ```

题目描述

给定 $n$,考虑 $2^n$ 个节点的**无向无权图**,节点标号 $0 \sim 2^n-1$。 对于节点 $x,y$,如果存在 $k \in \mathbb N$ 使得 $x \operatorname{xor} y=2^k$,则在 $(x,y)$ 之间连接一条边。 现在有一个隐藏的节点 $p$,你每次可以向交互库询问 $x$,交互库会给出 $(x,p)$ 之间**本质不同的最短路径条数**。注意这个整数可能超过 `int` 类型的存储范围。 **两条路径本质不同,当且仅当它们经过的点集不同。** 你需要在 $\textcolor{red}{16}$ 次询问内求出 $p$ 的值。 #### 交互说明 你需要实现函数 `int solve(int n)`: 该函数需要在调用不超过 $16$ 次 `query` 函数的情况下,返回 $p$ 的值。 你可以调用函数 `long long query(int x)`: 该函数会返回 $(x,p)$ 之间**本质不同的最短路径条数**,特别地,若 $x

输入格式

输入文件包含一个整数 $n$,每次测试的 $p$ 将在交互库内实现。 你不需要也不能读入输入文件。

输出格式

没有输出。

说明/提示

#### 一个可能的交互过程 注意不一定有逻辑。 | 选手程序 | 交互库 | |:-:|:-:| | | `guess(2)` | | `query(0)` | ||$1$| | `query(2)` || ||$2$| | `query(9178)` || ||$-1$| | $1$ || || ok Accepted. | #### 测试方法 你编写的 `solve` 函数会被调用至多 $10^5$ 次。 保证 std 的评测时间不超过 $50 \text{ ms}$,空间不超过 $5 \text{ MiB}$。 #### 数据范围 对于 $100\%$ 的数据,$2 \le n \le 16,0 \le p < 2^n$。