#P15830. [2025年山东集训第三轮]Soyo的秘密

    ID: 15041 传统题 1000ms 256MiB 尝试: 2 已通过: 1 难度: 9 上传者: 标签>数论算法基础构造CF2600中国剩余定理

[2025年山东集训第三轮]Soyo的秘密

Soyo 的秘密(divisors)

题目背景

Soyo 是一个温柔成熟的女孩子。

她总是喜欢能成为被依赖的人、被信任的人,但她却从未明白如何走进其他人的心。

或许 Soyo 一直都没有发现,在一段关系,或者说感情之中,人的了解是双向的。也许是她不愿将自己的过往坦诚地讲述出来,她总是在逃避,以至于最后自己的努力终究对抗不过任何风吹雨打。

但这一切逃不过 Anon 的眼睛。她知道,Soyo 也是一个需要被爱的女孩子。怎么样才能走进她的心呢?Anon 知道自己的社交能力可以帮自己从不经意的角落中旁敲侧击出一些信息,尽管如何整合它们已经远远超出了少女的能力。

固执的 Anon 会一直问,直到她能拼凑出完整的故事,然后当面把这一切说出来。

题目描述

Soyo 有一个隐藏的整数 xx

Anon 每次可以向 Soyo 询问一个非负整数 yCy\le C,Soyo 会回答 x+yx+y 的正因数个数。xx 是 Soyo 事先选定的,不会随着询问而变化。

Anon 知道 xx[1,N][1,N] 中的整数。你需要在不超过 QQ 次询问内,求出 TT 个隐藏整数 xx 的精确值。

本题原本是函数调用题。为了在 Hydro OJ 中评测,已改造成离线函数库模拟版

  • 选手程序需要 #include "dzilib.h"
  • 不应自行读入输入,也不应自行输出答案;
  • 通过调用下发头文件中的函数完成询问与回答;
  • 若所有回答正确且询问次数不超过限制,评测库会输出 Accepted:,专用 checker 会据此判定通过。

需要实现的程序形式

你需要提交一个包含 main 函数的 C++ 程序,并引用下发文件:

#include "dzilib.h"

可调用的函数如下。

int GetT();
long long GetN();
int GetQ();
long long GetC();

分别返回本测试点中的 T,N,Q,CT,N,Q,C。这四个值在同一个输入文件内固定。

long long Ask(long long y);

询问当前隐藏值 xx 对应的 x+yx+y 的正因数个数。要求 0yC0\le y\le C。所有测试组总询问次数不能超过 QQ

void Answer(long long z);

回答当前隐藏值 xx。若 z=xz=x,则进入下一组隐藏值;若这是最后一组,则评测库输出 Accepted:

输入格式

以下是评测库读取的输入格式,选手程序不应该直接读取。

第一行包含四个整数:

T N Q C

接下来 TT 行,每行一个整数 xx,表示当前组的隐藏值。

输出格式

选手程序不应该直接输出。

若程序成功在询问限制内回答所有隐藏值,评测库会输出以 Accepted: 开头的信息;否则会输出错误原因。

样例 1 输入

2 1000000 10000 1000000000000000
1000
1

样例 1 输出

Accepted: queries used = 询问次数.

样例解释

以下是一次可能的交互过程:

选手程序 评测库 解释
调用 GetT() 返回 22 T=2T=2
调用 GetQ() 返回 1000010000 Q=10000Q=10000
调用 Ask(1) 返回 88 1001=7×11×131001=7\times 11\times 13
调用 Ask(3) 返回 44 1003=17×591003=17\times 59
调用 Answer(1000) 进入下一组 第一组答案正确
调用 GetT() 返回 22 参数不会变化
调用 Ask(0) 返回 11 11 的正因数个数为 11
调用 Ask(99) 返回 99 100=22×52100=2^2\times 5^2
调用 Answer(1) 输出 Accepted: 所有答案正确

数据范围

本题共 101101 个测试文件,输入文件名为 data1.indata101.in,输出文件名为 data1.ansdata101.ans

官方原题数据范围如下:

测试点 分数 TT NN QQ CC
1 13 50 10510^5 5×1045\times 10^4 101210^{12}
2 12 10610^6 5×1035\times 10^3
3 16 10 10910^9 5×1045\times 10^4
4 15 101410^{14} 5×1035\times 10^3 101710^{17}
5 14 2×1032\times 10^3
6 8 13001300
7 950950
8 6 820820
9 5 750750
10 4 720720

Hydro OJ 使用说明

本题为离线函数库模拟版,需要下发 dzilib.h。评测时使用 spj.cpp 作为 checker,只检查评测库是否输出 Accepted:

选手代码示例结构:

#include "dzilib.h"
#include <bits/stdc++.h>
using namespace std;

int main() {
    int T = GetT();
    long long N = GetN();
    int Q = GetQ();
    long long C = GetC();

    while (T--) {
        // 通过 Ask(y) 获取信息
        // 最后调用 Answer(x)
    }
    return 0;
}

@下发文件