测试点 1
大概是用来让你感受这个奇怪语言的劲的。找到代码中奇怪的数就能拿到 10 分。
一种可以拿到 10 分的输入:
23333333
测试点 2
先运行一次,发现需要输入 10 个整数。用你喜欢的方式在代码中找到 geti
片段。发现每次读入进来之后,如果 $ 1
和 # 0
相等就输出 ok
否则输出 ko
。于是我们不需要搞清楚代码的原理,只要修改一下代码,每次打印 # 0
然后复制粘贴即可。
注意代码中存在跳转行号,所以尽量不要一次插入多行输出行,不然可能会导致行号倒闭然后代码乱飞。
一种可以拿到 10 分的输入:
7
47
1965
1915
-2551
-1646938625
-322
-167542220
4346926
1531256182
测试点 3
用你喜欢的方式在代码中找到 putc @ 111
片段,可以发现代码中总共有 10 处输出 ok
,按照 1−3−3−3 的方式分布。运行一下可以发现,它让你输入 20 个数,只要输入了就可以得到第一个 ok
。事实上,如果你无脑打了 20 个相同的整数,可以发现输出是 ok fail fail ok ok ok
,也就是我们拿到了第四组限制的三分。
观察代码可以发现,后三组限制都是,判断某个量是否和预设量相等,如果是就输出三个 ok
。通过打印中间变量,进行一些最基础的尝试可以发现,三个限制分别为:
- 20 个数至少一个非 0。
- 20 个数的和为 0。
- 20 个数全部相等。
回想题面中描述的关于自然溢出的说明,可以想到,只需要输出 20 个 230 即可。
一种可以拿到 10 分的输入:
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
1073741824
测试点 4
尝试几次,根据输出的提示可以发现,读入的是一个字符串可以获得 3 分,字符串长度恰好为 18 可以再获得 2 分。
依然是用你喜欢的方法找到 putc @ 111
,发现在代码的末尾有一个可以输出 5 个 ok
的地方。它的判断条件自然在它之前紧跟着它,可以找到第 300 行开始的 9 行一周期循环了 18 次的相似代码块,在其中的判断语句中可以找到一些接近 100 的数,大胆猜测它对应 ASCII 码。查阅题面的表格构造对应的输入即可。
一种可以拿到 10 分的输入:
primaryschoolpupil
测试点 5
代码中出现了功能类似于对 998244353 取模的片段。
测试一下可以发现它需要输入 10 个字符串。在输出 ok
的语句之前可以找到十个判断,发现是判断某运算结果和大整数是否相等。猜测是字符串哈希,打印运算结果,尝试几次后可以发现 a
到 z
对应 0 到 25,底为 26。
于是将判断中的 10 个大整数按照 26 进制分解即可。
一种可以拿到 10 分的输入:
z
x
l
r
p
vfk
lssb
driozw
bqqcgzg
sanuwq
测试点 6
代码和测试点 5 几乎完全一致。进行尝试后可以发现在这份代码中底为 31。
直接进行 31 进制分解可能会存在某一位 ≥26 的情况。于是暴力枚举和大整数模 998244353 同余的数直到不存在这种情形即可。
一种可以拿到 10 分的输入:
p
n
nxybfe
bchdeeu
bdaeyow
eimvdvj
cqtmtzr
dcshgqm
djgxcsu
hilgqu
测试点 7
尝试一下可以发现要输入 10 个整数。代码的判断部分和前面两个测试点相似,打印中间变量后可以发现是在模 998244353 意义下求出输入的逆元并进行比较。逆元运算是可逆的,求出参与比较的 10 个整数的逆元即可。
一种可以拿到 10 分的输入:
998244353
1
224032231
204247430
800006205
536388420
830137805
173645564
591950221
212467234
测试点 8
与第 7 个测试点相似,同样是存在某个函数 f(x) 将输入变换后与 10 个整数比较。打印中间变量可以发现 f(0)=0,f(1)=1,但 f(2) 很大并且看上去没有规律。
尝试打印 f(−1) 发现会 Runtime Error,于是尝试 f(998244351),f(998244352),f(998244353) 和 f(998244354),发现有周期 998244353,并且是奇函数。猜测是指数函数,写暴力验证可以得到 f(x)=x77977。
由于 gcd,所以可以直接求出 77977 次方根。或者可以写一个暴力来枚举,跑五分钟不到可以跑出来。
一种可以拿到 10 分的输入:
0
1
43409364
171593339
879723643
750576725
275034811
464166077
503262602
826391194
测试点 9
还不会。
测试点 10
还不会。