htd1的新生教程 题解
\(\color{red}{标程}\)
htd1的签到题教程 I 题解
可以发现 \(\text{f}_n\) 只由 \(\text{f}_{n-1}\) 和 \(\text{f}_{n-2}\) 决定,也就是 \(\exists n,m\in \mathbb{N}^*\) 且 \(n\not=m\),\(\text{f}_{n-1}=\text{f}_{m-1},\text{f}_{n-2}=\text{f}_{m-2}\),则一定有 \(\text{f}_{n}=\text{f}_{m}\)。
有了上面的结论,我们便可以将 \(\text{f}\) 的相邻两项看成一个整体,由于模数 \(q\) 很小,只有 79,所以互不相同的整体最多只会出现 \(q^2\) 项,显然存在循环节。
故我们可以先暴力查找循环节,对于 \(n\to m\) 中完整的循环可以直接乘算,两头零散的单独计算。
特别注意,如果 \(n,m\) 都在同一个循环中,需要特判直接暴力计算。
htd1的传送带 I 题解
因为每个传送带有且仅有一个方向,所以所有传送带的最终路线是一样的。
对于一格,如果向它走的那一格在边界外,或者那一格可以走到边界外,则这一格也可以。
方案一:
使用 dfs,如果一个格子不能直接走出去,则搜索它指向的那个格子,直到搜索到一个已遍历过的格子或区域外,回溯更新。
因为一个点遍历时只被搜索一次,复杂度 \(\mathcal{O}\left(n^2\right)\) 。
方案二:
使用并查集,将区域外设置为一个终点,将所有点和它指向的点归入一个并查集,最终查询多少点是以区域外终点在同一个并查集内。
每个点进入一次并查集,并搜索一次,复杂度 \(\mathcal{O}\left(n^2\alpha\right)\) 。
htd1的位运算教程 题解
观察式子 \(\text{a}_\text{i}+\text{a}_\text{j}=\text{a}_\text{i}\&\text{a}_\text{j}+\text{a}_\text{i}\mid\text{a}_\text{j}+\text{a}_\text{i}\oplus\text{a}_\text{j}\)。
容易发现和位运算基础等式中的 \(\text{a}_\text{i}+\text{a}_\text{j}=\text{a}_\text{i}\&\text{a}_\text{j}+\text{a}_\text{i}\mid\text{a}_\text{j}\) 仅仅相差一项 \(\text{a}_\text{i}\oplus\text{a}_\text{j}\)
且根据异或性质 \(\text{a}_\text{i}\oplus\text{a}_\text{j}=0\) 当且仅当 \(\text{a}_\text{i}=\text{a}_\text{j}\) 。
所以问题转化为有多少个不同的区间使其内数字都相同。
对于一段长度为 \(x\) 的相同数字组成的区间,很容易发现可以找到 \(\frac{x\times(x+1)}{2}\) 个不同的区间。
所以对数组扫一遍即可,复杂度 \(\mathcal{O}(n)\) 。

浙公网安备 33010602011771号