LOJ6587 WF2019 交通堵塞 CRT、bitset

传送门


首先设\(P = lcm(r_i + g_i)\),因为\(P \mid 2019!\),所以在\([0,2019!]\)里随机实数相当于在\([0,2019!)\)随机实数,相当于在\([0,P)\)内随机整数。

需要求出被每扇门关住的概率,不妨先算出通过前若干扇门的概率然后差分一下。

求出通过前\(i\)扇门的概率相当于\(i\)个模意义下区间的求交,可以做到\(O(NP_i)\)但是显然太慢。

我们考虑:当我们有两个模意义下的区间\(x \in [l_1,r_1] \mod P\)\(x \in [l_2 , r_2] \mod Q\)\(P \perp Q\),则由中国剩余定理可知,如果合并得到的模意义下的区间是\(x \in [L,R] \mod PQ\),那么\((R - L + 1) = (r_1 - l_1 + 1)(r_2 - l_2 + 1)\)。这提示着我们两个互质的数是独立的,可以独立计算概率。

同时如果\(P \mid Q\)或者\(Q \mid P\),也能快速进行合并。那么假如说我们的所有\(r_i + g_i\)都存在质数\(p\)和正整数\(k\)满足\(r_i + g_i = p^k\),那么我们可以将所有门扫过去,把所有\(p^k\)的门使用bitset合并在一起然后计算答案。

但是实际上并不是这样,所以我们考虑能否将所有模数转化为\(p^k\)的形式。我们考虑枚举\(a \in [0,X)\),将开始时间等于\(t = kX + a(k \in Z)\)的所有时间点放在一起做。在上面的做法中\(X = 1\),但是在这里显然不可行。注意到:\(kX + a \in [l,r] \mod p(p = r_i + g_i)\)满足条件只和\(k \mod \frac{p}{\gcd(p , X)}\)有关,我们只需要让所有\(\frac{p}{\gcd(p,X)}\)只存在一个质因子即可。暴枚可以求出最小的\(X = 2520\)

这样我们可以枚举\(k\)\([0 , \frac{p}{\gcd(p , X)})\)中的合法值(这可能不是一段区间,但是并没有什么关系),再跟上面的做法一样做就可以了。只需要较为精细的实现就可以做到\(O(100XN)\)的复杂度,加上bitset可以获得\(\frac{1}{w}\)的常数优化。

代码

posted @ 2019-05-25 23:12 CJOIer_Itst 阅读(...) 评论(...) 编辑 收藏