#P14483. [集训队互测 2018] 神秘货币

    ID: 14418 远端评测题 1000ms 256MiB 尝试: 0 已通过: 0 难度: 9 上传者: 标签>数学2018集训队互测数论交互题Special Judge

[集训队互测 2018] 神秘货币

题目背景

试题来源:https://loj.ac/p/2468,向 LOJ 和出题人表示感谢。如果版权方并不希望试题出现在洛谷,可联系洛谷管理组撤下试题。

题目描述

此题为交互式试题。

在一个遥远的国度中,人们使用着一套神秘的货币系统。在他们的货币系统中有 nn 种不同的货币, 面值分别为 a1,a2,...,ana_1, a_2, ... , a_n,你可以假设每种货币的数量无限多。其中面值较小(即 ai103a_i \leq 10^3)的币种为硬币,记硬币的数量为 n1n_1;而面值较大(即 ai>103a_i > 10^3)的币种为纸币,记纸币的数量为 n2n_2。由于当地的特殊使用习惯,一些价格是可以通过组合这些货币表示出来的,而其他一些价格是不能被组合出来的。

现在你不知道这套货币系统的具体信息,包括 nnaia_i 的具体数值。但你可以通过向当地人询问一个价格 vv 能否由这些货币组合出来。当然,你需要询问尽量少的次数确定 nnaia_i

因为不同的 nnaia_i 可能可以达到相同的效果,所以你只需求出一种满足询问结果的答案。也就是说,对于所询范围内任意的 vv,你的答案能否组合出 vv 的结果应该与交互库的结果完全相同。

任务介绍

你需要实现一个函数 solve,解出这套货币系统的 nnaia_i 的具体数值。

  • solve(type)
    • type 为该测试点的数据类型,具体见「数据规模和约定」。

在每个测试点中,交互库都会调用恰好一次 solve 函数。在该函数中你需要调用函数query获取信息,调用函数answer提交答案。

你可以调用函数 query 来询问一个价格能否由货币组合出来,但是这个函数的调用次数不能超过 limitlimit 次。

  • query(v)
    • v 为你询问的价格,需要保证 0v10180 \leq v \leq 10^{18}
    • 这个函数会返回 0011 ,表示 vv 是否能够被组合出来。

你需要调用函数 answer 来提交答案,这个函数必须恰好调用 11 次。

  • answer(n, a)
    • n 为你求出的答案的元素个数,需要保证 1n1021 \leq n \leq 10^2
    • a 表示一个大小为 nn 数组,其中数组的第 ii 个位置的数值为 aia_i ,数组从 00 下标开始,需要保证 1ai1091 \leq a_i \leq 10^9

实现方法

你需要且只能提交一个源文件 currency.cpp 实现上述函数,且遵循下面的命名和接口。

你需要实现的函数 solve

void solve(int type);

函数 query 的接口信息如下:

bool query(long long v);

函数 answer 的接口信息如下:

void answer(int n, int *a);

你需要在代码开头声明函数 bool query(long long v);void answer(int n, int *a);

如何测试你的程序(仅针对 C/C++ 语言)

g++ grader.cpp currency.cpp -o currency -O2

可执行文件将从标准输入读入数据,将结果输出到标准输出

读入完成之后,交互库将调用 solve 函数。如果你调用 query 的次数超过 limitlimit 次,或调用 answer 的次数小于或大于 11 次,则交互库会输出错误信息,并退出。如果传入 query 函数和 answer 函数的参数非法,那么交互库会输出详细的错误信息,并退出。

当正确调用answer函数,solve 函数返回后,交互库会判断你提交的答案是否符合要求。如果答案正确,则会输出 Correct!,否则会输出 Incorrect!

在编译命令中加入 -DDEBUG 可以使交互库输出更多调试信息。

请注意最终测评使用的 currency.h 与下发的文件并不一致。

输入格式

如果要使用自己的输入文件进行测试,请保证输入文件符合格式以下要求,否则不保证程序能正确运行。

第一行包含两个整数 type,limittype, limit,需要保证 $type \in \{1, 2, 3, 4, 5, 6\}, 0 \leq limit \leq 10^9$。

第二行包含一个整数 nn,需要保证 1n1021 \leq n \leq 10^2

第三行包含 nn 个整数,其中第 ii 个数为 aia_i,需要保证 1ai1091 \leq a_i \leq 10^9n1n_1n2n_2 满足 typetype 类型的限制。



提示

对于 100%100 \% 的测试数据, 1n102,1ai1091 \leq n \leq 10^2, 1 \leq a_i \leq 10^9,交互库中的数据保证满足 n1,n2n_1, n_2 的限制,但你提交的答案可以不满足该限制。

子任务 分值 type= type = limit=limit = n1n_1 的规模 n2n_2 的规模
11 66 11 10001000 =1= 1 =0= 0
22 2222 22 4040
33 1616 33 600600 =1= 1
44 1212 44 10001000 1\geq 1 =0= 0
55 2828 55 22002200 =1= 1
66 1616 66 2200022000 1\geq 1