P5042 丢失的题面
顺序:10 - 1 - 7 - 8 - 9 - 4 - 5 - 6 - 2 - 3
Point 10
读入,特判,输出。
读入的英文意思是让选手输出自己的程序本身,这个题的确存在,但是这题并没有 SPJ ,所以特判一下输出输出文件就好了。
C++
的atoi
函数可以让读入的字符串变成数字以完成其他点的任务。
Point 1
我和其他聚铑做这个点的过程就十分有趣了。
开始,我们使用了大眼观察法观察了一下这个输出,不知道怎么我就看出了将序列每四个字符划分,然后变成若干以0110
开头的长度为
4 的 01 串组。发现这些组的大小都在 3 以内,于是我们在 OEIS
上搜了一下这个序列,居然真的找到了:A007413
它的递推方式是三个元素,每次操作
a->abc b->ac c->b
。这道题中这三个字母分别代表
0110
01101001
和 011010011001
。做了一下,发现是对的。
然后观察文件大小发现输出的字符串长度是 \(2^{22}\) 。没细想,写完就过了。
但是为什么是 \(2^{22}\) 呢?
我回头看了一眼,发现输出好像是初始一个 0 字符,每次操作将当前串取反拼接到后面,做 22 次的结果……(鬼知道我当初为啥直接就想每 4 个分组)
然后又看了下 OEIS,发现这个输出本身就是一个数列:A010060。这个序列还有个名字叫做
在wikihow中,叙述了这个序列的几种构造方法,除了上述的两种构造方式之外,还可以直接每次操作
0->01
1->10
来构造。
真有趣
但是代码还是用的第一次写的,懒得改了。(by a___)
1 | namespace subtask1{ |
Point 7
因为 2~6 个点都没有什么思路,直接来看第 7 个点。
观察了一下输入,发现是一个图,而且边没有边权。观察了一下输出,发现输出只有 0 和 INF 两种数字。于是几乎可以确定是判断图上两点间连通性了。
1 | namespace subtask7{ |
Point 8
切完了上面的点,一看这个点也是个图,而且边有边权。大概扫了一下发现这是个随机生成的树,边权也是随的。询问格式是两个点。
再观察输出,发现输出的答案大多都大于 90000。说明是一个答案期望较大的询问。两点间路径和或者乘积不可能,试验了一下异或发现答案溢出 100000,那么或也顺便排除。
傻了吧唧地想了半天,突然有一位聚铑想到,为啥不是最大值呢?
试了一下果然没错。
1 | namespace subtask8{ |
Point 9
观察了一下输入,发现是个图。
观察了一下输出,发现有 INF 的存在,那么询问可能是让答案尽量小,所以盲猜最小瓶颈路。试了一下,果然是。
kruskal 的并查集和路径最大值都可以用前面的板子。(出题人真良心)
1 | namespace subtask9{ |
Point 4
后面的全做完了,回头看一眼 01 串和 012 串,没啥思路,直接看第四个。
观察了一下输入输出,发现输入输出都是回文
什么玩意是回文的?
第一个字符大概是 n,发现第一项是 1,第二项是 n。于是有个聚铑很自然地想到是组合数,然后发现输出也是对应的 n 的一行组合数,于是就切了。
拆了一下数,发现模数是 104857601,一个 NTT 模数。
1 | namespace subtask4{ |
PS
后来思考了一下为什么输入把 131072 的一行组合数也全给了,根据二项式定理,输入给出的是 \((x+1)^n\),然后输出的 n 恰好是输入的两倍。所以实际上是让我们算 \((x+1)^{2n}\)。也就是做一遍多项式乘法。
会有人写这玩意吗,还是为了给没看出来是组合数的选手分?
Point 5
刚才切了第四个点的聚铑趁热打铁,瞬间就看出来了是每一项乘上了一个 \((-1)^i\) 。于是又切了。
当然,如果您想写多项式开根也可以。
因为和前面一个点比较像,就放在一起了。
1 | namespace subtask4{ |
Point 6
刚才那位聚铑乘胜追击,观察了一下输入输出的项数,发现输出刚好是输入的
\(\frac{1}{3}\) 。
什么东西能减少项数,而且刚好减到 \(\frac{1}{3}\)?
只有聚铑知道答案。他一眼就看出来这似乎是一个多项式三次剩余,然后确实是对的。
然而珂爱
似乎有更好的方法,因为这个 \(5e5\)
的数据范围,还是用的多项式快速幂真的太勉强了,加了快读快输开优化才能过。用珂爱
的方法或者多项式三次方根或许能更好(更短)地通过此题。
1 | namespace subtask6{ |
Point 2
终于要直面 01 串了。(由第一个点就可以知道我 01 串相关有多菜)
首先,一位聚铑通过观察文件大小发现字符个数恰好是斐波那契数列的第 33 项。
发现除了前三项,后面几项都符合斐波那契串。而一个斐波那契串内确实有这样的规律。
写了一下,发现是对的。
顺便模一下这位聚铑写得真可爱。
1 | namespace subtask2{ |
Point 3
这个点是最艰难的点了。
使劲找规律,先发现字符个数是 \(3^{12}+11\) ,然后思考有什么规律。
除去第一个 0,每 12 个数分开,看起来好像是三进制数每次 +1 再 +2 。
往后看了看,什么玩意
经过艰苦的奋斗,最终还是没找出来,于是去膜拜的珂爱
的题解。感觉就是个找规律。因为是抄别人的,所以写出来也没啥意思。贴一下别人的代码。
1 | namespace subtask3{ |
代码
都在上面了。贴一下我的主函数(包括第十个点的特判)和用到的全局函数和变量。
1 |
|