题解 P5246 【[集训队互测 2016] 消失的源代码】
zhaoyp
·
·
题解
大概自己做出了一半左右,写篇题解来记录下。
subtask1
发现整个过程跟字符串加密差不多,一个个打表可以发现是这样一种对应关系:
string str = "yfrbkgimujvphatdsnelozcxwq";
把输入的一位位替换就行了。
subtask2
打出前 10 位的表,找不到规律,那就差分。还是找不到规律,再差分,发现得到的结果都是 4032。
猜想答案是关于 n 的多项式,有 2016n(n-1) 这一项,进而解得 f(n) =2016n(n-1) + 2020n+10。
当然你也可以拉格朗日插值硬搞。
然后发现第 11 项比 f(11) 要小 233333,于是猜测模数就是 233333 验证一下发现是对的。
subtask3
比较神秘。
打表打出前 30 项,扔进 oeis 里,他会告诉你输出 \sqrt{\dfrac{n}{\pi}} 的整数部分。
subtask4
接下来这 3 个比较简单。
通过小数据测试发现答案是图上连通块大小的平方和。
subtask5
观察输入发现大概是这样的。
通过 $m=1$ 的尝试发现节点距离为路径上的边权和。扩大 $m$ 发现要把 $m$ 次的结果异或起来输出。
## subtask6
跟上面一个差不多,节点距离为路径上的边权最小值。
然后有一个很恶心的地方就是自己跟自己的距离是 $1987654321$。
## subtask7
打出 $10 \times 10$ 的表,每行 oeis 无果,发现输入大多是 $n=m$ 就把对角线上的数扔进 oeis,发现是在求 $\sum\limits_{i=1}^n\sum\limits_{j=1}^m gcd(i,j)$。
代码参考 [P1390](https://www.luogu.com.cn/problem/P1390)。
## subtask8
不会做,是让你求不同子串个数。
代码参考 [P2408](https://www.luogu.com.cn/problem/P2408)。
## subtask9
输入了一堆二元组,经过小样例的不断尝试发现是求平面最近点对。
代码参考 [P1429](https://www.luogu.com.cn/problem/P1429)。
## subtask10
因为我在写的时候没做出来的点都用 `invalid input!` 占位,然后发现过了。
那么就是输出 $10$ 个 `invalid input!`。