首先,设 \(d=\gcd(n,m)\),由简单的数论知识可知,在任意一天一起玩的男生和女生编号在\(\bmod d\) 意义下同余。所以我们可以把所有男生和女生按模 \(d\) 的值分组,然后我们只考虑同一组内的情况,即我们把其他组的人都抽出去,那么若求得 \(r\) 这一组子问题的答案为 \(t\),那么在原问题中这组的答案即为 \(dt+r\)(当第 \(0\) 天就合法时需要特判)。然后我们只需要对所有组的答案取 \(\max\)。
由裴蜀定理可知,只要一开始有一个人是快乐的,那么最后所有人都会变快乐。由于只有 \(b+g\) 个人快乐,所以当 \(d>b+g\) 时肯定至少有一组初始状态没有人快乐,这样 \(\gcd(n,m)\) 过大时我们直接输出 -1
就好了。
现在我们只需要考虑 \(\gcd(n,m)=1\) 的情况。我们考虑分别算出最后一个男生和最后一个女生的变快乐的时间,然后取 \(\max\)。先考虑女生的情况,男生类似。
我们发现,如果在第 \(i\) 天,第 \(i\bmod m\) 个女生是快乐的,那么第 \(i\) 天结束时,第 \(i\bmod n\) 个男生也一定是快乐的,那么我们考虑过了 \(n\) 天以后,第 \(i\bmod n\) 个男生会让第 \((i+n)\bmod m\) 个女生变快乐。
那么这可以等价于:\(n\) 天以后,第 \(i\bmod m\) 个女生让第 \((i+n)\bmod m\) 个女生变快乐了。所以,如果第 \(i\) 个女生在某一天变快乐了,那么 \(n\) 天后,第 \((i+n)\bmod m\) 个女生也一定会快乐。那么我们把这个建成最短路模型:
对每个女生 \(k\) 我们向第 \((k+n)\bmod m\) 个女生连一条边权为 \(n\) 的边,这相当于某时刻 \(k\) 变得快乐,那么 \(k+n\) 时刻 \((k+n)\bmod m\) 会快乐。
对每个一开始就快乐的女生 \(k\),从源点 \(S\) 向 \(k\) 连一条边权为 \(k\) 的边。
对每个一开始就快乐的男生 \(k\),从 \(S\) 向 \(k\bmod m\) 连一条边权为 \(k\) 的边,即时刻 \(k\) 第 \(k\bmod m\) 个女生会因该男生变快乐。
这样跑从 \(S\) 开始的最短路,求每个点的 \(dis\) 的 \(\max\) 就是答案。
但是我们发现点数是 \(10^9\) 级别的,没法跑,我们观察这个图的性质:第一类边把所有除 \(S\) 以外的点练成了一个大环,我们认为 \(S\) 直接连向的点为关键点,那么关键点的 \(dis\) 即为 \(S\) 连向这个点的边权。我们考虑把所有关键点按在环上的顺序排序(可以通过 exgcd 来实现),那么对于连续的两个关键点 \(A,B\),显然 \(B\) 前面的那个点是 \(AB\) 这一段之间 \(dis\) 最大的,我们对所有连续的点对都做一遍取 \(\max\) 就是答案。
代码:
1 |
|