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)\)

posted @ 2025-12-08 20:30  spring_sun  阅读(7)  评论(0)    收藏  举报