#P17142. [NOI 2026] 布丁

    ID: 17345 Type: RemoteJudge 12000ms 1024MiB Tried: 0 Accepted: 0 Difficulty: (None) Uploaded By: Tags>NOI交互题Special Judge信息论模拟退火随机化构造2026

[NOI 2026] 布丁

题目背景

题面、样例附件来自 QOJ。

提交到洛谷上时,无需引用头文件 #include "pudding.h"。直接将

void init(int c, int t);
int find_tastiness(int c, int m);
int query_tastiness(std::vector<int> a);

复制到程序开头,同时选用 C++17 或者更高版本编译器编译。

本题为交互题。

题目描述

小 L 和小 S 都非常喜欢香甜而软糯的布丁。在品尝过各种布丁后,她们将所有布丁的美味度量化为不超过 45004500 的正整数。

小 L 正在学习制作布丁。因熟练程度有限,她只能制作出美味度不超过常数 mm 的布丁。在某次尝试中,小 L 成功制作出了一块美味度为 ww 的布丁。小 S 想品尝小 L 制作的布丁,但需要按照小 L 要求的方式求出她制作的布丁的美味度。

具体地,小 S 可以从商店购买若干块布丁并交给小 L。小 L 会把自己制作的布丁混入其中,并将这些布丁按照美味度升序排序。然后,小 L 会计算全部相邻布丁美味度的最大公约数之和并告诉小 S。最后,她会将所有小 S 买来的布丁吃掉。

形式化地,设小 S 购买了 kk 块布丁,美味度分别为 a0,a1,…,ak−1a_0,a_1,\ldots,a_{k-1}。将 [a0,a1,…,ak−1,w][a_0,a_1,\ldots,a_{k-1},w] 按升序排序后的结果记为 [b0,b1,…,bk−1,bk][b_0,b_1,\ldots,b_{k-1},b_k],则小 L 会将 ∑i=1kgcd⁡(bi−1,bi)\sum_{i=1}^{k}\gcd(b_{i-1},b_i) 的值告诉小 S。

由于前往商店的时间成本与购买布丁的经济成本都很高,小 S 希望尽可能减少购买的次数以及购买的布丁总数。你需要帮助小 S 制定购买策略,以求出小 L 制作的布丁的美味度。

【实现细节】

选手不需要,也不应实现 main 函数。

选手需要确保提交的程序包含头文件 pudding.h,即在程序开头加入以下代码:

#include "pudding.h"

选手需要在提交的程序源文件 pudding.cpp 中实现以下两个函数:

void init(int c, int t);
  • c,tc,t 分别表示测试点编号与测试数据组数。c=0c=0 表示该测试点为样例。
  • 对于每个测试点,该函数会在程序开始运行时被交互库调用恰好一次。
int find_tastiness(int c, int m);
  • c,mc,m 分别表示测试点编号与小 L 制作的布丁的美味度上界。
  • 该函数需要返回一个正整数 ww,表示小 L 制作的布丁的美味度。
  • 对于每个测试点,该函数会被交互库调用恰好 tt 次。

选手可以通过调用以下函数进行一次询问:

int query_tastiness(std::vector<int> a);
  • aa 表示小 S 购买的布丁的美味度序列。选手需要确保 aa 非空,且其中的每个元素均为不超过 45004500 的正整数。
  • 该函数会返回小 L 告诉小 S 的值,具体含义如【题目描述】中所示。
  • 选手需要确保交互库每次调用 find_tastiness 时,调用该函数的次数不超过 1515,且调用该函数时传入的 aa 的长度之和不超过 30003000。

在任何情况下,交互库运行所需时间均不会超过 1.51.5 秒,所用内存不会超过 64 MiB64\ \mathrm{MiB}。

本试题目录下的 template_pudding.cpp 是提供的示例代码,选手可参考并实现自己的代码。

输入格式

【测试程序方式】

选手可以在本题目录下使用如下命令编译得到可执行文件:

g++ grader.cpp pudding.cpp -o pudding -O2 -std=c++14 -static

对于编译得到的可执行文件 pudding:

  • 可执行文件将从标准输入读入以下格式的数据:
    • 第一行包含三个非负整数 c,t,mc,t,m。
    • 第二行包含 tt 个正整数,分别表示每组测试数据中 ww 的值。
  • 可执行文件将输出以下格式的数据至标准输出:
    • 若 tt 次调用 find_tastiness 的返回值均正确,则:
      • 输出的第一行为 Correct!。
      • 输出的第二行为 Max queries used: Q,其中 QQ 表示所有测试数据中调用 query_tastiness 的次数的最大值。
      • 输出的第三行为 Max total puddings queried: S,其中 SS 表示所有测试数据中调用 query_tastiness 时传入的 aa 的长度之和的最大值。
    • 若至少一次调用 find_tastiness 的返回值不正确,则只会输出一行 Wrong answer.。
  • 若调用 query_tastiness 时传入的参数不符合要求,或调用次数超过上限,则可执行文件会向 标准错误流 输出错误信息,并返回 −1-1。
  • 选手可以在运行可执行文件时启用 -v 或 --verbose 参数,此时可执行文件将会额外输出以下内容:
    • 每次调用 find_tastiness 的返回值、正确性、调用 query_tastiness 的次数与传入的 aa 的长度之和。
    • 每次调用 query_tastiness 时传入的参数、计算过程以及返回值。
    • 程序最终获得的分数比例,具体可见【评分方式】一节。
0 2 197
26 121
Correct!
Max queries used: 2
Max total puddings queried: 5

提示

【样例 11 解释】

对于第一组测试数据,小 L 制作的布丁的美味度为 2626。以下是一种可能的交互过程:

  • 调用 query_tastiness([2026,7,20][2026,7,20]),则 b=[7,20,26,2026]b=[7,20,26,2026],因此函数返回 gcd⁡(7,20)+gcd⁡(20,26)+gcd⁡(26,2026)=1+2+2=5\gcd(7,20)+\gcd(20,26)+\gcd(26,2026)=1+2+2=5。
  • 调用 query_tastiness([13,52][13,52]),则 b=[13,26,52]b=[13,26,52],因此函数返回 gcd⁡(13,26)+gcd⁡(26,52)=13+26=39\gcd(13,26)+\gcd(26,52)=13+26=39。
  • 返回 2626,答案正确。
  • 调用 query_tastiness 的次数为 22,调用 query_tastiness 时传入的 aa 的长度之和为 3+2=53+2=5。

【样例 22】

见选手目录下的 pudding/pudding2.in 与 pudding/pudding2.ans。

该样例满足测试点 11 的约束条件。

【样例 33】

见选手目录下的 pudding/pudding3.in 与 pudding/pudding3.ans。

该样例满足测试点 22 的约束条件。

【样例 44】

见选手目录下的 pudding/pudding4.in 与 pudding/pudding4.ans。

该样例满足测试点 33 的约束条件。

【数据范围】

对于所有测试数据,均有:

  • 1≤t≤30001\le t\le3000;
  • 1≤m≤30001\le m\le3000,1≤w≤m1\le w\le m。

::cute-table{tuack} | 测试点编号 | 分值 | t=t= | m=m= | 特殊性质 | |:-:|:-:|:-:|:-:|:-:| | 11 | 1010 | 3535 | 3535 | 无 | | 22 | 2020 | 430430 | 30003000 | AA | | 33 | 7070 | 30003000 | 30003000 | 无 |

特殊性质 AA:ww 为质数。

【评分方式】

注意:

  • 选手不应当通过非法方式获取交互库的内部信息,如试图直接读取 ww 的值,或直接与标准输入、输出流进行交互。此类行为将被视为作弊。
  • 交互库不是适应性的,即每次调用 find_tastiness 时,ww 的值就已经确定,不会随交互过程变化。
  • 最终的评测交互库与样例交互库的实现不同。 若 find_tastiness 函数的返回值不正确,或调用 query_tastiness 时传入的参数不符合要求,则相应测试点得 00 分。 在上述条件基础上:
  • 对于每个测试点,设 QQ 表示所有测试数据中调用 query_tastiness 的次数的最大值,SS 表示所有测试数据中调用 query_tastiness 时传入的 aa 的长度之和的最大值,score\mathrm{score} 表示该测试点的分值,则程序获得 $\left\lfloor f(Q)\cdot g(S)\cdot\mathrm{score}\right\rfloor$ 分,其中 ff 与 gg 的计算方式如下。

::cute-table{tuack} | QQ | f(Q)f(Q) | |:-:|:-:| | Q≤4Q\le4 | 11 | | 5≤Q≤155\le Q\le15 | 0.7Q−40.7^{Q-4} |

::cute-table{tuack} | SS | g(S)g(S) | |:-:|:-:| | S≤35S\le35 | 11 | | 36≤S≤7536\le S\le75 | 1−S−351001-\dfrac{S-35}{100} | | 76≤S≤23576\le S\le235 | 0.2+235−S10000.2+\sqrt{\dfrac{235-S}{1000}} | | 236≤S≤3000236\le S\le3000 | 0.2×2−S−23515000.2\times2^{-\frac{S-235}{1500}} |