ARC127F ±AB 解题记录
题意:
给出整数 \(V,A,B,M\),你可以进行以下四种操作若干次:
- \(V \to V+A\)
- \(V \to V+B\)
- \(V \to V-A\)
- \(V \to V-B\)
但你必须时刻保证 \(V\in[0,M]\)。
求你可以得到多少种不同的 \(V\)。
多组数据,数据组数 \(T \leqslant 10^5\)。
\(1 \leqslant A < B \leqslant M \leqslant 10^9\)
保证 \(\gcd(a,b)=1\)。
被新初二小朋友薄纱的题!说明其实是普及组 T2 难度。
首先考虑什么时候可以遍历所有元素。
实际上 \(A+B \leqslant M+1\) 就可以遍历完。这是显然的。
现在来讨论如何解决 \(A+B \geqslant M+2\) 的情况。
可以观察到的是:我们可以分别钦定只使用 \(+A/-B\),\(+B/-A\) 的操作(显然先用 \(+A\) 再用 \(-A\) 没有意义,而先 \(+A\) 再 \(+B\) 不可能),这样每个数字只有一种可能的操作。
可以发现的是:每种操作一定不会产生循环(因为 \(\gcd(a,b)=1\))。而如果这两种操作有交,那么就相当于找到了一个循环,于是这两种操作能到达的数不会相交。
现尝试解决只使用 \(+A/-B\) 的情形,我们假设在抵达一个不能操作的点 \(V'\) 前一共使用了 \(k\) 次 \(+A\) 操作,那么答案就是 \(k+\lfloor\dfrac{V+Ak}{B}\rfloor\)。
由于 \(V'\) 不能操作了,可以得到:
现给出结论:
令 \(V_0=V\bmod B\),如果 \(V_0+A \leqslant m\),就有:
\[V_0+(Ak\bmod B) = (V+Ak)\bmod B \]
下面给出证明:
首先上述结论等价于 \(V_0+(Ak\bmod B) < B\),考虑反证:
如果 \(V_0+(Ak\bmod B) \geqslant B\),那么 \(V_0+(Ak\bmod B)-B\) 是一个可以到达的数。
由于已经钦定了最多只能使用 \(k\) 次 \(+A\),所以:
这与 \(V_0+A \leqslant m\) 矛盾!因此结论成立。
已知了这个结论就好做了,首先特判掉 \(V_0+A > m\) 的情况,我们就有:
\(V_0+(Ak\bmod B)+A>m\),取适当的 \(L,R\),即 \(Ak \bmod B \in [L,R]\)。
这是可以使用类欧解决的经典问题:
令 \(A \to A\bmod B\),取 \(r,t\) 满足 \(B=Ar+t,t\in[0,A-1]\)。
设 \(\lfloor\dfrac{Ak}{B}\rfloor=w\),就有:
类似欧几里得算法的,复杂度为 \(\log\) 值域。可以通过此题。