测试点 $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$ 个 $2^{30}$ 即可。
一种可以拿到 $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$ 进制分解可能会存在某一位 $\geq 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)=x^{77977}$。
由于 $\gcd(77977,\varphi(998244353))=1$,所以可以直接求出 $77977$ 次方根。或者可以写一个暴力来枚举,跑五分钟不到可以跑出来。
一种可以拿到 $10$ 分的输入:
0
1
43409364
171593339
879723643
750576725
275034811
464166077
503262602
826391194
测试点 $9$
还不会。
测试点 $10$
还不会。