Description
题目链接:UOJ 73
本题是一道提交答案题,一共有 $10$ 个测试点。
对于每个测试点,你会得到一段程序的源代码和这段程序的输入。你要运行这个程序,并保存这个程序的输出。
遗憾的是这些程序效率都极其低下,无法在比赛的 $5$ 小时内得到输出。
你需要帮助 B 君得到这些程序的输出。
Solution
Program 1
分析
给 $d$ 加上 $b$ 个 $a$,答案对 $c$ 取模(注意模数很大)。
代码
1 |
|
答案
1 |
11239440904485 |
Program 2
分析
可以找出 $a,b,c$ 的递推式子:
得到转移矩阵:
直接矩阵快速幂即可解决本题。
代码
1 |
|
答案
1 |
0 |
Program 3
分析
容易发现:
其中任意数字的 $0$ 次方都定义为 $1$。
直接套用 $1,2,3,4$ 次方和公式即可。
代码
1 |
|
答案
1 |
1000000000000001 |
Program 4
分析
对于 $\text{count1}$ 函数,就是求有多少个无序点对满足两个点都是 $1$。直接统计 $1$ 点个数即可。
对于 $\text{count2}$ 函数,就是对于每个 $1$ 点,求出到它曼哈顿距离最近的白点的距离。可以直接从 $0$ 点 $\text{BFS}$。
代码
1 |
|
答案
1 |
65300 |
Program 5
分析
源代码中的 $\text{count3}$ 函数就是在寻找有多少个全 $1$ 子矩阵。很显然是单调栈裸题。我们逐行分析,对于当前行维护每个点往上的最大全 $1$ 长度 $h_i$,求出 $h_i$ 左边第一个大于它的位置 $l_i$,右边第一个大于等于它的位置 $r_i$,那么对答案的贡献为 $h_i\times (i-l_i+1)(r_i-i+1)$。
代码
1 |
|
答案
1 |
36798 |
Program 6
分析
乍一看就是求 $f(f(f(\dots f(t))))$ 对 $c$ 取模,这个东西貌似是有环的?于是我们考虑找环,也就是找到这个环的起点。
我们可以使用 $\text{Floyd}$ 判环算法,这个过程和 $\text{Pollard-Rho}$ 算法的实现很相似。因为这个环一定长成类似 $\rho$ 的形状。
我们设环长为 $n$,环之前的链长为 $m$,考虑使用两个指针,一个慢指针每次前进一步,一个快指针每次前进两步。两者都从起始点出发,当他们第一次相遇时一定有:
- 慢指针移动了 $m+k_1 n+r$ 步。
- 快指针移动了 $m+k_2 n+r$ 步。
由于快指针的速度是慢指针的两倍,那么设慢指针走了 $S$ 步,快指针走了 $2S$ 步,两式相减得到:
这意味着他们走过的路程都是环长的若干倍。
接下来我们把慢指针移动到起始位置,让两个指针都只移动一步,当慢指针移动了 $m$ 步,快指针总共移动了 $2S+m$ 步。对这个 $2S+m$ 有如下分析:
- 计算出这个值:快指针和慢指针速度相同,都移动了 $m$ 的距离,加上之前的 $2S$ 就是 $2S+m$ 步。
- 换个角度思考:从起始位置走 $m$ 步到达环的起点,由于 $2S$ 是环长的整数倍,那么一定又走到��环的起点!
这样一来我们就得到了环的起点!
当然本题可以用更加优秀的 $\text{Brent}$ 算法。
这个环长貌似是期望 $\sqrt c$ 的代?码只要十分钟就可以跑出来了!
代码
1 |
|
答案
1 |
518048760868869048 |
Program 7
分析
完成一个 $16\times 16$ 的数独(字母独)。
加上一些剪枝可以轻松跑出来前几个数独,最后几个数独需要采用倒搜。
代码
1 |
|
答案
1 |
NAPILFJBMHEOGDCKJDCHMNIPAFGKOBLEKLMGAEHONCDBPJFIFEOBCDGKIJLPAMHNOFHLJMBGEKIDCNAPPCEAHLDFBMJNIKGOBNIKOAPEFGCHJLMDMGDJNIKCLOPAFHEBIOBPFKLJHEMGDANCDKJEIGMAOBNCLFPHGMNCEPOHDLAFKIBJAHLFDBCNPIKJEGOMEIFMBHADKPOLNCJGHPADGJFICNBEMOKLLJKOPCNMGAHIBEDFCBGNKOELJDFMHPIA |
Program 8
分析
我们发现这个代码本质就是求,对于所有的整数 $a,b,c,d,e,f,g\in [1,n]$,满足各种奇淫不等式的七元组有几个?
由于有 $7$ 个未知数,那么答案一定是关于 $n$ 的一个 $7$ 次多项式。可以暴力跑出来 $n\in [1,8]$ 的答案,然后拉格朗日插值即可。
代码
此处不放出具体代码了,拉格朗日插值的写法详见「算法笔记」拉格朗日插值。
答案
1 |
1018333390 |
Program 9
分析
- 答案为 $1984$。
- 常用密码 $123456$。
我怎么知道这个人是chenlijie
。- 爆搜可以得到 。
- 发现在 Program $2$ 中有一部伪英语字典,将其中每个单词的 $\text{MD5}$ 跑出来后和输入文件中的对比可以得到
we
。 - 同询问 $5$,
hold
。 - 同询问 $5$,
these
。 - 同询问 $5$,
truths
。 - 由于最后一行的提示
最后 6 行组成了一句名言
,可以在 Program $10$ 中找到这句话We hold these truths to be selfevident
。因此为to be
。 - 同询问 $9$,
selfevident
。
代码
要什么代码?QAQ
答案
1 |
1984 |
Program 10
分析
发现每个单词的函数运行时间不长,而瓶颈主要在 A
到 Z
函数。而他们的本质就是执行若干次 _
函数,直接递推出这些函数分别执行了多少次 _
即可。
代码
这么长代码放上来干嘛?QAQ
答案
1 |
6754098618987872142 |