ARC127F ±AB 解题记录

题意:

给出整数 \(V,A,B,M\),你可以进行以下四种操作若干次:

  1. \(V \to V+A\)
  2. \(V \to V+B\)
  3. \(V \to V-A\)
  4. \(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+Ak)\bmod B+A>m \]

现给出结论:

\(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+(Ak\bmod B)-B+A > m \]

这与 \(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\),就有:

\[Ak-Arw-tw\in[L,R]\\ tw\bmod A\in[L',R'] \]

类似欧几里得算法的,复杂度为 \(\log\) 值域。可以通过此题。

posted @ 2022-09-06 17:20  一般通过小萌新  阅读(69)  评论(1编辑  收藏  举报