#P17142. [NOI 2026] 布丁

    ID: 2916 传统题 文件IO:pudding 12000ms 1024MiB 尝试: 3 已通过: 1 难度: 8 上传者: 标签>NOI 2026交互题Special Judge

[NOI 2026] 布丁

题目描述

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

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

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

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

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

【实现细节】

选手不需要,也不应实现 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 分别表示测试点编号与小 LL 制作的布丁的美味度上界。
  • 该函数需要返回一个正整数 ww,表示小 LL 制作的布丁的美味度。
  • 对于每个测试点,该函数会被交互库调用恰好 tt 次。

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

int query_tastiness(std::vector<int> a);
  • aa 表示小 SS 购买的布丁的美味度序列。选手需要确保 aa 非空,且其中的每个元素均为不超过 45004500 的正整数。
  • 该函数会返回小 LL 告诉小 SS 的值,具体含义如【题目描述】中所示。
  • 选手需要确保交互库每次调用 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 时传入的参数、计算过程以及返回值。
    • 程序最终获得的分数比例,具体可见【评分方式】一节。

输出格式

输入输出样例 #1

输入 #1

0 2 197
26 121

输出 #1

Correct!
Max queries used: 2
Max total puddings queried: 5

说明/提示

【样例 11 解释】

对于第一组测试数据,小 LL 制作的布丁的美味度为 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.inpudding/pudding2.ans

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

【样例 33

见选手目录下的 pudding/pudding3.inpudding/pudding3.ans

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

【样例 44

见选手目录下的 pudding/pudding4.inpudding/pudding4.ans

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

【数据范围】

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

  • 1t30001\le t\le3000
  • 1m30001\le m\le30001wm1\le w\le m

::cute-table{tuack}

测试点编号 分值 t=t= m=m= 特殊性质
11 1010 3535
22 2020 430430 30003000 AA
33 7070 30003000

特殊性质 AAww 为质数。

【评分方式】

注意:

  • 选手不应当通过非法方式获取交互库的内部信息,如试图直接读取 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$ 分,其中 ffgg 的计算方式如下。

::cute-table{tuack}

QQ f(Q)f(Q)
Q4Q\le4 11
5Q155\le Q\le15 0.7Q40.7^{Q-4}

::cute-table{tuack}

SS g(S)g(S)
S35S\le35 11
36S7536\le S\le75 1S351001-\dfrac{S-35}{100}
76S23576\le S\le235 0.2+235S10000.2+\sqrt{\dfrac{235-S}{1000}}
236S3000236\le S\le3000 0.2×2S23515000.2\times2^{-\frac{S-235}{1500}}

附件下载

pudding.zip 705.37KB