#P2838. 瓶子国的故事

    ID: 1886 Type: RemoteJudge 1000ms 125MiB Tried: 0 Accepted: 0 Difficulty: 7 Uploaded By: Tags>洛谷原创提交答案Special Judge

瓶子国的故事

题目背景

这是一道非传统题。

传说有一个国家叫瓶子国,里面有大大小小的瓶子。

现在瓶子国想要学习邻居跳蚤国发展计算机,可是瓶子国没有计算机只有瓶子。

于是瓶子国国王就给了你一些瓶子,让你实现一些计算任务。

题目描述

我们用水的量来描述一个数。

  • 一个瓶子的容量为它最多可以装的水的数量。

瓶子国国王认为瓶子可以干这些事:

  • I\verb!I!:制造一个新瓶子,它的容量和里面装的水量都为输入的数,这个瓶子的编号为 当前最大编号+1\textbf{当前最大编号} +1
  • s\verb!F !s;把编号为 ss 的瓶子里的水倒满。
  • s\verb!E !s:把编号为 ss 的瓶子里的水倒空。
  • s\verb!C !s:制作一个新瓶子,它的容量为 ss,里面没装水,这个瓶子的编号为 当前最大编号+1\textbf{当前最大编号} +1。注意由于瓶子容积有限,0s1090\le s\le 10^9
  • s\verb!M !s:制作一个新瓶子,它的容量为 s 号瓶子里装的水的数量\textbf{s 号瓶子里装的水的数量},里面没装水,这个瓶子的编号为 当前最大编号+1\textbf{当前最大编号}+1
  • a b\verb!T !a\ b:把 aa 瓶往 bb 瓶倒水,直到 aa 瓶空或者 bb 瓶满为止。(注意 aba\neq b)。
  • s\verb!O !s:把 ss 号瓶子里的水输出。

还有一种昂贵的操作:

  • a b\verb!K !a\ b:制作一个新瓶子,它的容量为 a 号瓶子的容量×b 号瓶子的容量\textbf{a 号瓶子的容量} \times \textbf{b 号瓶子的容量},这个瓶子的编号为 当前最大编号+1\textbf{当前最大编号}+1。注意由于瓶子容积有限,a 号瓶子的容量×b 号瓶子的容量\textbf{a 号瓶子的容量}\times\textbf{b 号瓶子的容量},不能超过 10910^9。(使用这种操作要扣分,评分规则详见下方提示)

现在瓶子国国王把这些操作给了你,你只要输出这些操作,瓶子国的瓶子们就会为你执行!

瓶子国国王给了你一些计算任务,你只需要实现这些任务就行啦!

左边是数据点编号,右边是计算任务。

  1. 输入 aabb,计算 a+ba+b。(0a,b1050\le a,b\le 10^5
  2. 输入 aabb,计算 ab|a-b|。(0a,b1050\le a,b\le 10^5
  3. 输入 aabb,计算 max(a,b)\max(a,b)。(0a,b1050\le a,b\le 10^5
  4. 输入 aabb,输出 gcd(a,b)\gcd(a,b)。(1a,b10001\le a,b\le 1000
  5. 输入 aa,输出 aa3232 位二进制表示。(0a1050\le a\le 10^5,例如 55 输出 $\verb!0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1!$)
  6. 输入 aabb,输出 a×ba\times b。(0a,b10000\le a,b\le 1000
  7. 输入 aabb,输出 aba\oplus b。(0a,b1050\le a,b\le 10^5\oplus 表示异或)
  8. 输入 aa,输出 a÷10a\div 10 下取整。(1a100001\le a\le 10000
  9. 输入 aabb,输出 a×bmod262144a\times b \bmod 262144。(0a,b1050\le a,b\le 10^5
  10. 输入 aabb,输出 aabb 次方。(1a,b10001\le a,b\le 1000aabb 次方不超过 10610^6

瓶子国国王会生成 3030左右的数据对你的程序进行测试,并根据你使用的操作个数进行评分,评分规则详见下方提示。

UPD:如果你没有看懂题目这里有一段补充说明)

提交到洛谷的程序(C/C++/Pascal)需要输出一段操作,格式类似样例输出。

例如第一个点,提交后洛谷上的 checker 会随机生成 aabb 作为 I\verb!I! 操作的输入来测试你的操作。

对于本地 checker(下载见提示区),你可以把输出的操作保存成 a.txt,然后第一行输入 a.txt,第二行如果手玩就输 00,如果测试指定点就输编号。

输入格式

输入共一行一个整数,表示数据点编号。

输出格式

输出可以满足计算任务的操作。

233
// 仅作为参考,这里应该填数据编号
I
C 1
F 2
C 233333
T 1 3
T 2 3
O 3
(这个程序可以进行x+1!是不是很厉害啊!不过程序中并不能附加任何注释)

提示

请注意提交的是一段输出操作的程序!(如果你生成答案之后把生成它的程序删了直接打表输出,可能会输出超限)

灵感来自 NOI2016 旷野大计算(其实我不说你们肯定也知道啊)

为了方便选手本地测试,下面是一个 C++ 的本地checker(需要注意的是,它的测试结果与洛谷上的测试结果不一定一样,洛谷上可能更严格):

如果需要下载 exe 的话可戳度盘:

评分规则

如果你的算法输出了错误结果(多输出也算)或者发生运行错误(操作不符合要求等)或者行数超过 5×1065\times 10^6 行或者行数太长了 checker 没能在 1s1s 内测试完 3030 组数据,你将获得 00 分。

否则,假设 std 的步数为 ss,你的步数为 xx

  • 如果 xsx\le s,你的基准分为 1010 分。
  • 如果 s<xs+5s<x\le s+5,你的基准分为 99 分。
  • 如果 s+5<x3ss+5<x\le 3s,你的基准分为 88 分。
  • 如果 3s<x10s3s<x\le 10s,你的基准分为 77 分。
  • 如果 10s<x50s10s<x\le 50s,你的基准分为 66 分。
  • 如果 x>50sx>50s,你的基准分为 55 分。

如果你使用了昂贵的 K\verb!K! 操作,你会得到(基准分 4-4)分。

否则你会得到基准分。

(说人话:步数越少分越高,用K操作扣4分)

UPD2:洛谷上的checker常见错误信息

too many lines:超过500w行(这个似乎还没有触发过)
WTF:就是操作的第一个字符串(I/T/K/F/E/C/M/O)长度大于1
(可能是由于上一个操作多跟了一个操作数?)
wrong operation:操作的第一个字符串长度为1但不是I/T/K/F/E/C/M/O。
expected *****:希望输入一个数/字符串却没有(可能是操作数多打/少打)
nothing to input:I操作数量大于输入的数数量
F/E/C/M/T/O/K wrong bottle:操作的瓶子编号不在[1,当前最大编号]范围内
C exceed [0,10^9]:字面意思
K exceed 10^9:字面意思
wa on test xxx:你在第xxx组随机数据狗带了
wa on extratest xxx:你在第xxx组人工数据(手打的)狗带了