Problem A. 货币兑换 / \(\mathcal{Money}\)
最贪心的思路显然是每次取当前花费最小的一边,但是暴力做显然会超时。考虑我们这样选造成的后果 —— 两种数字花费的价格一定是差不多的,于是我们可以二分这个“差不多”的价格 \(mid\),每次尽可能将两种货币能换的都换了,不过需要注意,可能最后还有一次兑换没有实现,这次兑换将可能出现在较便宜的那一边,注意特判。事件复杂度 \(\mathcal O(q\log x)\).
Problem B. 格雷码 / \(\mathcal{Matrix}\)
我他妈直接把 \(\require{enclose}\enclose{horizontalstrike}{\rm BM}\) 拿去给你妈陪葬。 等我线性递推大成的时候,我就可以切这个题了。
Problem C. 优秀的拆分 / \(\mathcal{Number}\)
当 \(n\) 比较小的时候,我们可以做数位 \(\rm DP\),不过我们会发现,当 \(n\) 变大,答案的位数将会呈几何倍速增长,这个时候再数位 \(\rm DP\) 显然是不合时宜的。
真的无计可施了吗?我们拿 \(n = 6\) 举个例子,此时 \(n^3=216,n^4=1296\),但是我们注意到,即使填出来的数几乎全是 \(9\),也会有大概 \(\left\lfloor\frac{216}{9}\right\rfloor = 24\) 位,如果我们随意取出三个数位来让他们减去一,那么我们有 \({24\choose 3}=2024>n^4=1296\) 种。即,若 \(n\) 很大,那么最后的答案构造就十分简单了 —— 许多个 \(9\),某些位置是 \(8\),然后,我们就可以根据这个进行构造了。另,
Problem D. 编不出题目 / \(\mathcal{Decrypt}\)
先搞清楚加密方法:\(t_i\gets k_{i\bmod m}^{s_i}\). 我们不妨任取一个 \(p=4324321\) 的原根 \(G\),那么,其他任意原根 \(g_i\) 都可以表示为 \(G^x\equiv g_i\pmod p\),设 \(k_i\equiv G^{l_i}\pmod p\),显然,有 \((l_i,\varphi(p))=1\),同时加密就变成了:
\[t[i]\equiv G^{l[i\bmod m]\times s[i]}\pmod p \]因为再使用下标,字母就小得几乎不可见了,所以这里用 \([\;]\) 表示下标。不妨设 \(t[i]\equiv G^{a[i]}\pmod p\),那么,我们实际上想要解决一系列 \(a[i]\equiv l[i]\times s[i]\pmod {\varphi(p)}|i\in [0,m - 1]\),然后检验 \([m,n]\) 解密之后是否在字母表中。注意到 \(s[i]\) 之间限制的位置都是独立的,我们可以对于每一个 \(s[i]\) 枚举它,然后检验它所管辖的位置反解出来的明文是否合法,由于我们最后的目标区间为 \([32,126]\),而模数限定的区间为 \([0,p)\),如果 \(s[i]\) 是假的,那么很有可能落在目标区间外面,因此,检测的时间复杂度期望为 \(\mathcal O(1)\). 因此精细实现的话,可能还是可以通过。
不过有些比较有意思的东西,比如空格,其 \(\rm ASCII\) 码为 \(32\),并且 \((l[i],\varphi(p))=1\land 32\mid \varphi(p)\),因此 \(32\mid s[i]\),这就意味着 \(s[i]=32\)(其他 \(32\) 的倍数都不在字符集中),拥有类似性质的还有 \(\tt inh\) 等也有这个性质。我们用这些加快速度,复杂度得以通过。