#P51938. 「LOJ」 月之都的密码

「LOJ」 月之都的密码

题目描述

*题目描述可能与東方Project原设定不完全相符。

月之都正在阴谋向幻想乡迁移!

奇怪的机械已经在幻想乡中移动,并在「净化」幻想乡——他们在试图让幻想乡不再存在生物!灵梦不得不再次与早苗、魔理沙一同前去解决异变。

很快,她们便解决掉了在幻想乡前线的月兔清兰和铃瑚,并成功拿到了几台向月都发送情报时的加密工具。但是由于魔理沙一个魔炮轰上去把铃瑚一 B 带走了,所以这些加密工具也接近报废了。

经过河城荷取对窃听到的密文情报以及这台加密仪器的分析,她发现月都在前线发回的情报的加密方式其实比较简单。大约可以描述如下:

设月都发来的情报的字符集大小为 nn,则加密过程是将 [1,n][1,n] 中的 nn 个整数壹壹对应到 [1,n][1,n] 的整数上。或者说,这个过程 f(x)f(x) 是一个 [1,n][1,n][1,n][1,n] 的双射。
而这些加密仪器,则可以在一次使用中对于任意给定的集合 SS,给出加密后的集合 S={xx=f(a),aS}S'=\{x\mid x=f(a),a\in S\}
但是根据河城荷取的分析,一台仪器最多再使用 TT 次就会彻底报废。每台仪器所保有的加密方式以及 TTnn 根据损坏情况与用途各不相同。

为了获取更多的计划情报,她们需要利用这些接近报废的加密仪器解出它们密文到原文的映射 f(x)f'(x)
由于这些仪器已经接近报废,她们需要尽快找到方法来解出解密所有月都情报的方法。
于是八云紫随手拉开一道隙间把你拉了出来,要你解决这个问题。如果布星就把你拉去隙间掉!

为了保命,你需要写一个程序完成所有几台仪器的处理。你的程序需要一次处理一台

交互方式

你有两种交互方式: 第一种是使用标准输入输出交互(Codeforces 风格),第二种是使用函数调用来进行交互(WC/APIO/IOI 风格)。

注意,我们提供的第二种交互方式的接口的底层实现是对第一种交互的简易封装。但是建议使用第二种来避免可能出现的 Invalid Interaction 错误。

标准 I/O 交互

首先你的程序可以从标准输入读取两个整数 nnTT,含义如题目描述所述。

你可以通过标准输出执行两种命令:

  • encode 命令,用于进行一次加密操作。其后应跟随一个数字 kk 表示加密集合的大小,后跟 kk 个空格分隔的整数表示你要加密的集合。
    例: encode 3 514 495 233 表示对集合 {233,495,514}\{233,495,514\} 进行加密。
    该命令执行完毕后你的程序可以在标准输入流中读取 kk 个数,表示加密结果。
    注意你要尝试加密的集合不能带重。
  • submit 命令,表示你已经得到了答案。其后应该有 nn 个空格分隔的整数,第 ii 个数表示 ii 解密后的值。
    你的程序在输出此命令后应当立即结束。
    例: 若 n=3n=3,你找到的解密方案是 1223311\rightarrow 2,2\rightarrow 3,3\rightarrow 1,则你应当执行: submit 2 3 1

注意,如果你使用标准 I/O 进行交互,那么你需要在输出你要执行的命令后刷新 stdout 的缓冲区来将命令发送到交互器。 如果你使用 iostream 系列,可以输出 std::flushstd::endl 来刷新缓冲区。如果你使用 C 风格 I/O,那么请调用标准库函数 fflush(stdout) 来刷新。

函数调用交互

此部分仅支持 C++ 语言。

首先你需要包含头文件 interaction.h

你需要实现一个定义与如下定义等同的函数:

  • std::vector<int> Decode(int n,int T)
    • 在每个测试点中,交互库会调用恰好一次该函数。
    • 其中参数 int n 即为题目描述中的 nnint T 即为题目描述中的 TT
    • 该函数应该返回一个包含密码表的 std::vector<int>,该 std::vector<int> 下标为 ii 的位置的值应该是值 i+1i+1 的解密结果。

交互库中还有如下函数可供调用:

  • std::vector<int> Encode(const std::vector<int>& v)
    • 该函数将会返回一个包含 v 中的值的加密结果的 std::vector<int>
    • 注意你要加密的集合不能带重。

数据范围与提示

本题共有 2020 个测试点。每个测试点信息如下表:

测试点编号 nn TT 测试点编号 nn TT
1  1  0 11 1000 300
2 100 99999 12 100000 10000
3 1000 13 20 6
4 100000 14 100 15
5 20 15  15  1000 40
6 100 75 16 100000 1020
7 1000 500 17 20 5
8 100000 50000 18 100 7
9 20 7 19 1000 10
10 100 35 20 100000 17

如果你的程序没有提交正确答案并正常结束,则该测试点得 00 分。

如果你的程序提交了正确答案,但调用 encode 命令的次数超过了 TT,该测试点同样得 00 分。否则该测试点得满分。

注意由于交互的底层实现为标准 I/O 管道,如果你与交互库的总通信量过大的话,即使你调用 encode 命令的次数不足 TT 次,仍可能会出现运行超时的情况而导致该测试点爆零。不建议你查询的 S\sum |S| 超过 1×1071\times 10 ^7 级别。