#P14678. [Bulgarian2022]gcd
[Bulgarian2022]gcd
题目类型
本题为交互题 / 提交函数题。
拉多和埃米尔在玩一个游戏。拉多先想好一个整数 ,满足 ;随后埃米尔需要不断提问来猜出这个数。
埃米尔每次可以提出如下形式的问题:
与 的最大公约数是多少?
其中参数必须满足:
也就是说,交互库会返回:
埃米尔希望用尽可能小的平均询问次数猜出 。已知拉多选取 的方式是完全均匀随机的,也就是说区间 中每个整数被选中的概率都相同。
请你帮助埃米尔,编写程序 gcd.cpp 来完成这项任务。你的程序会与评测器程序一起编译,评测器扮演拉多。
实现细节
你需要实现如下函数:
ull play(ull MAX_X);
该函数会被调用很多次(并且每次的 MAX_X 都相同)。你的函数需要返回当前这次游戏中拉多所选的整数 。
为此,你可以多次调用评测器提供的函数:
ull query(ull a, ull b);
该函数会返回:
你的程序:
- 不应包含
main函数; - 不应从标准输入读入数据;
- 不应向标准输出打印任何内容;
- 必须包含头文件:
#include "gcd.h"
其中 ull 被定义为 unsigned long long。
在满足以上要求的前提下,你可以自由定义辅助函数、变量、常量等内容。
约束
评分方式
每个测试点单独评分。要在某个测试点上获得分数,你的程序必须:
- 在该测试点的所有
play调用中都正确猜出 ; - 向
query传入的参数始终合法。
函数 play 会被调用 次。
设你的程序在某测试点上的平均 query 调用次数为 ,该测试点给定常数 。则你在这个测试点上获得的分数比例为:
- 当 时:
- 当 时:
测试点
| 测试点 | 分值 | MAX_X | T1 | T2 |
|---|---|---|---|---|
| 1 | 10 | 100 | 9 | 25 |
| 2 | 90 | 6.3 | 15 |
本地测试
官方提供了文件 gcd.h 与 Lgrader.cpp,你可以将它们与你的程序一起编译进行本地测试。
运行程序后,需要输入 MAX_X。随后你的解法会被执行,程序将输出:
- 平均询问次数;或
- 错误信息(若出现错误)。
正式评测所使用的 grader 的行为与提供的本地 grader 一致。
示例交互
| 编号 | play 的动作 |
grader 的动作 | 说明 |
|---|---|---|---|
| 1 | play(10) |
此时 | |
| 2 | query(0, 15) |
return 3 |
|
| 3 | query(2, 8) |
return 8 |
|
| 4 | return 6 |
||
| 5 | play(10) |
此时 | |
| 6 | query(1, 7) |
return 1 |
|
| 7 | query(12, 10) |
return 2 |
|
| 8 | query(0, 10) |
return 10 |
|
| 9 | return 0 |
||