比赛心得 - NOI2024 省选 OIFC 模拟 8

彩蛋:

\(\tt T1\) 排队

题目大意:一群人排队,男男间隔 \(a\),男女间隔 \(b\),女女间隔 \(c\),男生打饭要 \(d\) 的单位时间,女生 \(e\) 的单位时间。

队列长 \(n\) 米,问可能的排队方式的排队时间总和是多少,对 \(10^9+7\) 取模。

显然看出一个 dp,可以先用 \(f_{0,i,0/1}\) 表示前 \(i\) 单位距离,最后一个人是 \(0\) 男 \(1\) 女的可能时间之和。

然后我们发现这样需要再用一个 \(f_{1,i,0/1}\) 来记录前面的人数。

状态转移方程:

\[f_{0,i,0}=f_{0,i-a,0}+f_{0,i-b,1}+d\times (f_{1,i-a,0}+f_{1,i-b,1}) \]

即为前面男生,前面女生和前面男生打饭时间。

同理:

\[f_{0,i,1}=f_{0,i-c,1}+f_{0,i-b,0}+e\times (f_{1,i-c,1}+f_{1,i-b,0}) \]

最后是:

\[f_{1,i,0}=f_{1,i-a,0}+f_{1,i-b,1} \\ f_{1,i,1}=f_{1,i-c,1}+f_{1,i-b,0} \]

这样就可以拿到 \(50\) 分了。

注意到注意力惊人我们的转移只和 \(i-a\),\(i-b\),\(i-c\) 有关。

那么我们考虑滚动数组优化?

忘记说了 \(\sout{a,b,c\leq 30}\)。

就可以只记录前 \(30\) 个数,就能不 RE 了。

注意到 \(n\leq 10^{18}\) 超时。

看来还是矩阵快速幂。

传奇乐子快速幂的 \(\sout{b}\) 没开 ll 然后出负数直接超时没救了。


https://www.luogu.com.cn/article/gp7uu970

posted @ 2026-10-08 20:51  Ivan422  阅读(2)  评论(0)    收藏  举报