Kevin090228🍬的博客

博客

ZJOI 2015 Day 2 T1 黑客技术

2024-12-19 11:33:42 By Kevin090228🍬

测试点 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,按照 1333 的方式分布。运行一下可以发现,它让你输入 20 个数,只要输入了就可以得到第一个 ok。事实上,如果你无脑打了 20 个相同的整数,可以发现输出是 ok fail fail ok ok ok,也就是我们拿到了第四组限制的三分。

观察代码可以发现,后三组限制都是,判断某个量是否和预设量相等,如果是就输出三个 ok。通过打印中间变量,进行一些最基础的尝试可以发现,三个限制分别为:

  • 20 个数至少一个非 0
  • 20 个数的和为 0
  • 20 个数全部相等。

回想题面中描述的关于自然溢出的说明,可以想到,只需要输出 20230 即可。

一种可以拿到 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,发现在代码的末尾有一个可以输出 5ok 的地方。它的判断条件自然在它之前紧跟着它,可以找到第 300 行开始的 9 行一周期循环了 18 次的相似代码块,在其中的判断语句中可以找到一些接近 100 的数,大胆猜测它对应 ASCII 码。查阅题面的表格构造对应的输入即可。

一种可以拿到 10 分的输入:

primaryschoolpupil

测试点 5

代码中出现了功能类似于对 998244353 取模的片段。

测试一下可以发现它需要输入 10 个字符串。在输出 ok 的语句之前可以找到十个判断,发现是判断某运算结果和大整数是否相等。猜测是字符串哈希,打印运算结果,尝试几次后可以发现 az 对应 025,底为 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)=0f(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

还不会。

Comments

[+2]
收到
  • 2024-12-19 12:40:25
  • Reply
Comment replies
Kevin090228🍬:怎么不能回复 qq 表情了
/se
  • 2024-12-19 16:43:06
  • Reply
Comment replies
/se
  • 2024-12-28 14:14:40
  • Reply
1−2sinxcosxcos2x−sin2x
  • 2024-12-28 14:18:23
  • Reply

Post a comment

You can use @mike to mention the user mike.

If you wish to input the '@' character, please use @@