I Random
题意:给定对 x x x 进行 m m m 次左移/右移并异或的函数 rand ( x ) \text{rand}(x) rand(x),问期望对 [ 0 , 2 n − 1 ] [0,2^n-1] [0,2n−1] 上均匀随机分布的 x x x 执行多少次 rand \text{rand} rand 可以变回 x x x 本身。 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1≤n≤105, 1 ≤ log 2 x ≤ 32 1\le \log_2 x \le 32 1≤log2x≤32。
解法:整体做法:对映射矩阵的极小多项式的阶枚举因数统计答案,进行莫比乌斯反演。
首先考虑下面的引理 1:
引理 1:这个随机数生成器是一个 k k k 维模 2 2 2 ( F 2 \mathbb{F}_{2} F2)的向量空间 V V V 中的线性映射 A A A,且 A A A 可逆。
证明:由于题目给出的 0 < ∣ a i ∣ 0 < |a_i| 0<∣ai∣ ,因而容易证明每一步单步操作对应一个由列初等变换得到的可逆矩阵,而 A A A 可以看作每一步操作对应的可逆矩阵的乘积。
由于矩阵 A A A 可逆,因而有引理 2:
引理 2:对于任意输入 x \boldsymbol{x} x,周期 t t t 必然存在,即 A t x = x A^t\boldsymbol{x}=\boldsymbol{x} Atx=x,即这个线性映射意义下的阶,下记为 o r d ( x ) {\rm ord}(\boldsymbol x) ord(x)。
证明:如果把向量 x \boldsymbol{x} x 看成一个节点,向量空间 V V V 看成一张图 G G G,那么显然每个点都有一个后继 A x A\boldsymbol{x} Ax,也都有一个前驱 A − 1 x A^{-1}\boldsymbol{x} A−1x。这就是说 G G G 一定是由若干个环构成的。于是我们证明了每个 x \boldsymbol{x} x 的周期 t x t_{\boldsymbol{x}} tx 必然存在,且为它的阶 o r d ( x ) {\rm ord}(\boldsymbol{x}) ord(x)。
因而最后的答案为 1 2 k ∑ i = 0 2 k − 1 o r d ( i ) \displaystyle \dfrac{1}{2^k} \sum_{i=0}^{2^k-1}{\rm ord}(i) 2k1i=0∑2k−1ord(i),其中 i i i 表示 i i i 的二进制表示对应的向量 x i \boldsymbol{x}_i xi。当然,直接统计的时间复杂度是不可接受的。但是以 t t t 为周期(不一定是最简周期)的向量 x \boldsymbol x x 的数量却可能是容易的。考虑引理 3:
引理 3:以 t t t 为周期(不一定最简)的向量数量为 2 k − r a n k ( A t − E ) 2^{k-{\rm rank}(A^t - E)} 2k−rank(At−E) 。
证明:立刻能发现符合条件的向量数量本质上是方程 A t x = x A^{t}\boldsymbol{x} = \boldsymbol{x} Atx=x 的解集大小。也就是求 ∣ ker ( A t − E ) ∣ |\text{ker}(A^{t} - E)| ∣ker(At−E)∣ 或者说 2 nul ( A T ) 2^{\text{nul}(A^{T})} 2nul(AT),其中 ker \ker ker 指的是零空间, n u l \rm nul nul 指的是零化度, E E E 是单位阵。根据秩-零化度定理,解个数就是 2 k − r a n k ( A t − E ) 2^{k-{\rm rank}(A^t - E)} 2k−rank(At−E) 。
考虑通过容斥求出每个向量具体的阶,以 s s s ( s ∣ t s|t s∣t)为阶的向量的答案可以通过对以 t t t 为周期的向量数量容斥求出。这是因为到每一个以 t t t 的因子为最小周期的 x \boldsymbol{x} x 也会以 t t t 为周期,故而我们需要容斥掉 t t t 的因子的贡献。设 f ( t ) = t × 2 k − r a n k ( A t − E ) × 2 − k f(t) = t \times 2^{k-{\rm rank}(A^t - E)}\times 2^{-k} f(t)=t×2k−rank(At−E)×2−k,阶为 s s s 的向量对答案的贡献为 g ( s ) g(s) g(s),则由上知 f ( t ) = ∑ s ∣ t g ( s ) \displaystyle f(t) = \sum_{s|t} g(s) f(t)=s∣t∑g(s)。若知 f ( t ) f(t) f(t) 的值,莫比乌斯反演即可线性求得 g ( s ) g(s) g(s)。问题可转化为求 f ( t ) f(t) f(t)。
然而 s , t s,t s,t 的量级是难以确定的。上述操作仍不足以解决此题,甚至不一定会使得时间更优。我们注意到不少 s s s 贡献均为 0 0 0 ,因此尝试寻找 s s s 的性质和量级。有引理 4:
引理 4:所有 s s s 均是方程 A r = E A^r =E Ar=E 的解 r r r 的因子。
证明:由于 A A A 本质有限且可逆,不难发现 { A r } \{A^r\} {Ar} 构成一个循环群。 根据群论的拉格朗日定理,有限群的循环子群的阶是其母群的阶的因数。此处母群即是整个群 ⟨ { A 0 = E , A 1 , ⋯ , A r − 1 } , × ⟩ \langle \{A^0=E,A^1,\cdots,A^{r-1}\}, \times\rangle ⟨{A0=E,A1,⋯,Ar−1},×⟩,而子群表示由阶为 s s s 的元素构成的子群 ⟨ { A 0 , A s , A 2 s , ⋯ , A r − s } , ⋅ ⟩ \langle \{A^0,A^{s},A^{2s},\cdots,A^{r-s}\}, \cdot \rangle ⟨{A0,As,A2s,⋯,Ar−s},⋅⟩,显然有 s ∣ r − s s|r-s s∣r−s。
利用引理 4,我们知道最小周期 s s s 是循环子群的阶。在这里,我们可以认为其母群的阶即是最小的 r r r 使得 A r = E A^r =E Ar=E 。
引理 5:母群的阶 r r r 是方程 X r ≡ E ( m o d p ( X ) ) X^r \equiv E \pmod {p(X)} Xr≡E(modp(X)) 的最小正整数解。其中 p ( X ) p(X) p(X) 是极小多项式,即一个 F 2 {\mathbb{F}}_2 F2 上的最低次首一多项式 p ( X ) ∈ { ∑ i = 0 l p i X l ∣ p i ∈ F 2 , 1 ≤ l < r } \displaystyle p(X)\in \left \{\left .\sum_{i=0}^l p_iX^l\right|p_i \in \mathbb F_2,1 \le l < r \right\} p(X)∈{i=0∑lpiXl pi∈F2,1≤l<r} 满足 p ( A ) = 0 p(A) = 0 p(A)=0。
证明:由于 A A A 满秩,因而 ∀ k , A k ≠ 0 \forall k,A^k \ne 0 ∀k,Ak=0,因而 p ( X ) ∤ A r p(X)\nmid A^r p(X)∤Ar。所以不难注意到在模 p ( x ) p(x) p(x) 的矩阵乘法运算作用下的代数系统 ⟨ { A 0 , A s , A 2 s , ⋯ , A r − s } , ⋅ ( m o d p ( X ) ) ⟩ \langle \{A^0,A^{s},A^{2s},\cdots,A^{r-s}\}, \cdot \pmod{p(X)}\rangle ⟨{A0,As,A2s,⋯,Ar−s},⋅(modp(X))⟩ 也是一个群。由于 A r = E A^r =E Ar=E,考虑对 A r − E = 0 A^r-E=0 Ar−E=0 进行因式分解,则 p ( A ) p(A) p(A) 为 A r − E A^r-E Ar−E 中的一项或若干项的乘积。假设 r r r 是极小多项式 p ( X ) p(X) p(X) 的阶,即最小的正整数满足 ∀ X , p r ( X ) = E \forall X,p^r(X)=E ∀X,pr(X)=E 的 r r r,则必然有 X r − E = 0 X^r -E=0 Xr−E=0,则可推出 X r ≡ E ( m o d p ( X ) ) X^r \equiv E \pmod {p(X)} Xr≡E(modp(X))。而显然如果母群的阶 r ’ < r r’<r r’<r,则 p r ′ ( X ) ≠ E p^{r'}(X) \ne E pr′(X)=E,则 X r ′ ≠ E X^{r'} \ne E Xr′=E 矛盾。因而该方程的解就是原问题的解。
方程 X r ≡ 1 ( m o d p ( X ) ) X^r \equiv 1 \pmod {p(X)} Xr≡1(modp(X))正是标准的离散对数问题,可以使用 BSGS
求解出 r r r,然后对 r r r 分解出 t t t 计算答案,最后莫比乌斯反演即可解决。
接下来,倘若我们能够证明 r r r 的范围,便可以解决此题。接下来的部分是对这样做的时间复杂度正确性的证明。
引理 6: r < 2 k r < 2^k r<2k。
证明:对于 A A A 的特征多项式 q ( λ ) = ∏ i = 1 k q i α i ( λ ) q(\lambda)=\displaystyle \prod_{i=1}^k q_i^{\alpha_i}(\lambda) q(λ)=i=1∏kqiαi(λ) ,由卡莱-哈密顿定理可得 q ( A ) = 0 q(A)=0 q(A)=0。因而利用引理 5 的结论,方程 A x ≡ E ( m o d q ( X ) ) A^x \equiv E \pmod{q(X)} Ax≡E(modq(X)) 的解一定是 r r r 的倍数,可以通过它框定 r r r 的范围。考虑 q ( λ ) q(\lambda) q(λ) 的结构,考虑进行一个类似于 excrt 的过程——将 q ( λ ) q(\lambda) q(λ) 根据每个不可约多项式进行分解,首先研究每个不可约质多项式下同余多项式的解范围,再升次,最后合并这些解。它在线性空间中的意义是,每一个因式 q i α i ( λ ) q_i^{\alpha_i}(\lambda) qiαi(λ) 都对应一个不变子空间,也就是 q i α i ( A ) q_i^{\alpha_i}(A) qiαi(A) 的零空间,记作 ker ( q i α i ( A ) ) \ker(q_i^{\alpha_i}(A)) ker(qiαi(A)) 。可以验证,所有 ker ( q i α i ( A ) ) \ker(q_i^{\alpha_i}(A)) ker(qiαi(A)) 的直和就是 k k k 维全空间,即它们的基向量彼此线性无关。
现在我们考察每一个 ker ( q i α i ( A ) ) \ker (q_i^{\alpha_i}(A)) ker(qiαi(A)) 。对于全空间中的某一个向量 x \boldsymbol{x} x ,它的周期即是它在每一个子空间里的分量的周期的 l c m \rm lcm lcm。因此,我们只需要考察每一个子空间里的分量的周期的量级,求取 l c m \rm lcm lcm 即可得出全空间里的每一个分量的周期的量级。对于 q i α i ( X ) q_i^{\alpha_i}(X) qiαi(X) ,我们考察它的不可约因子 q i ( X ) q_i(X) qi(X)。因为 F 2 \mathbb F_2 F2 上 d d d 次不可约多项式 q ( X ) q(X) q(X) 是 X 2 d − X X^{2^d} - X X2d−X 的因子,故而不可约多项式 q i q_i qi 的周期 r i , 1 r_{i, 1} ri,1 不会超过 2 d 2^d 2d 。在这里,周期指的是最小正整数 r i , 1 r_{i, 1} ri,1 使得 X r i , 1 ≡ E ( m o d q i ( X ) ) X^{r_{i,1}} \equiv E \pmod {q_i(X)} Xri,1≡E(modqi(X)) 。
为了籍此推出 q i k i ( X ) q_i^{k_i}(X) qiki(X) 的周期的量级,我们需要证明引理 6.1:
引理 6.1:若 F 2 \mathbb{F}_2 F2 上的不可约多项式 p ( X ) p(X) p(X) 的周期是 d d d,那么 p k ( X ) p^k(X) pk(X) 的周期的上界(可以证明是紧上界)是 d × bitceil ( k ) d \times \text{bitceil}(k) d×bitceil(k) 。
证明:因为 p ( X ) ∣ ( X d − 1 ) p(X) | (X^{d} - 1) p(X)∣(Xd−1),故而 p 2 ( X ) ∣ ( X d − 1 ) 2 p^2(X) | (X^{d} - 1)^2 p2(X)∣(Xd−1)2。在 F 2 \mathbb F_2 F2 上, ( X d − 1 ) = ( X d + 1 ) (X^d - 1) = (X^d + 1) (Xd−1)=(Xd+1),于是 p 2 ( z ) ∣ ( X d + 1 ) ( X d − 1 ) = X 2 d − 1 p^2(z) | (X^d + 1)(X^d - 1) = X^{2d} - 1 p2(z)∣(Xd+1)(Xd−1)=X2d−1。故而 p bitceil ( k ) ( X ) p^{\text{bitceil}(k)}(X) pbitceil(k)(X) 的周期是 d × bitceil ( k ) d \times \text{bitceil}(k) d×bitceil(k) 。又显然若 i < j i<j i<j 则 p i ( z ) p^i(z) pi(z) 的周期不大于 p j ( X ) p^j(X) pj(X) 的周期,故而 p k ( X ) p^k(X) pk(X) 的周期的上界是 d × bitceil ( k ) d \times \text{bitceil}(k) d×bitceil(k) 。
由此我们得到了 r r r 的规模为 lcm ( 2 d i × bitceil ( k i ) ) \text{lcm}(2^{d_i}\times \text{bitceil}(k_i)) lcm(2di×bitceil(ki)),在这里, d i d_i di 是不可约多项式 p i ( X ) p_i(X) pi(X) 的次数。这个值是显著小于 O ( 2 k ) O(2^k) O(2k) 的。
最后,考虑复杂度:
结论:这样做的复杂度的级别是 O ( n k 2 + k 3 + k 2 k + max 1 ≤ i ≤ 2 k d 2 ( i ) ) O\left(nk^2 + k^3 + k\sqrt{2^k} + \max_{1\le i \le 2^k}d^2(i)\right) O(nk2+k3+k2k+max1≤i≤2kd2(i))。
证明:梳理一遍整个算法流程:
- 首先我们预处理出映射矩阵 A A A ,这需要 n n n 次 F 2 \mathbb{F}_2 F2 上的矩阵乘法,复杂度是 O ( n k 2 ) O(nk^2) O(nk2) 。
- 我们首先求 A A A 的极小多项式 p ( X ) p(X) p(X) :我们找到最小的 m m m 使得 ∃ { a } m ∈ { F 2 } m , ∑ i = 0 m − 1 a i A i = A m \displaystyle \exist \{a\}_m \in \{\mathbb F_{2}\}_m, \sum_{i = 0}^{m-1} a_iA^{i} = A^m ∃{a}m∈{F2}m,i=0∑m−1aiAi=Am ,即 p ( X ) = X m − ∑ i = 0 m − 1 a i X i \displaystyle p(X) = X^m - \sum_{i=0}^{m-1} a_iX^i p(X)=Xm−i=0∑m−1aiXi 。根据凯莱-哈密顿定理, A A A 一定是其特征多项式 q ( λ ) q(\lambda) q(λ) 的根即 q ( A ) = 0 q(A)=0 q(A)=0,而特征多项式为 k k k 次,因而 m ≤ k m \le k m≤k 。故而这个部分的复杂度是 O ( k 3 ) O(k^3) O(k3) 。
- 接下来,我们使用
BSGS
求出阶 r r r, r r r 的规模在前文已经证明为 O ( 2 k ) O(2^k) O(2k),故而这里需要 O ( k 2 k ) O\left(k\sqrt{2^k}\right) O(k2k) 的复杂度。- 然后,我们以 O ( r ) = O ( 2 k ) O\left(\sqrt r\right) = O\left(\sqrt{2^k}\right) O(r)=O(2k) 的复杂度分解 r r r ,并枚举它的因数。考虑到 d ( n ) d(n) d(n) 的规模足够小,可以不使用莫比乌斯反演, d 2 ( n ) d^2(n) d2(n) 的暴力容斥也是可以接受的。
这样,我们就完成了此题。
J Roulette
题意:Walk Alone 初始有 n n n 块钱,如果每次投 x x x 元,有一半的概率输掉这 x x x 元,另一半概率赢得 2 x 2x 2x 元。现在 Walk Alone 采取下述策略投注:
- 如果上一把赢了,这一把投 x i = 1 x_i=1 xi=1 元
- 如果上一把输了,这一把投 x i = 2 x i − 1 x_i=2x_{i-1} xi=2xi−1 元。
问 Walk Alone 有多大概率拿到 n + m n+m n+m 元离开。 1 ≤ n , m ≤ 1 0 9 1 \le n,m\le 10^9 1≤n,m≤109。
解法:不难注意到,以“输输输……输赢”为一个周期,可以赢到一块钱。
如:输输输赢输赢赢赢赢 可以划分为:输输输赢/输赢/赢/赢/赢/,即以一次赢结束,找到上一次赢的地方,划分成一块。对于每一个周期内,假设前面输了 n n n 轮,那么整个周期赚的钱为 − 1 − 2 − 4 − ⋯ − 2 n + 2 n + 1 = 1 -1-2-4-\cdots-2^n+2^{n+1}=1 −1−2−4−⋯−2n+2n+1=1。
因而需要经过 m m m 个这样的周期。考虑每个周期不会输光的条件:如果当前有 x x x 元,那么不能连输超过 r r r 次,其中 r r r 是最大满足 2 r − 1 ≤ x 2^r-1 \le x 2r−1≤x 的正整数,否则就将没有钱继续投入。这样成功的概率为 1 − ( 1 2 ) r 1-\left(\dfrac{1}{2}\right)^r 1−(21)r,即不会连续输 r r r 次。
由于我们在赢钱的过程中是一轮赢一块钱,因而随着赢钱轮数增加, r r r 也会发生变化,但是不难注意到 r r r 的级别和个数都是 log x \log x logx 级别的。因而可以考虑枚举 r r r,对于每个 r r r,该段的 x x x 获胜的概率均相等—— [ 2 r − 1 , 2 r + 1 − 2 ] [2^r-1,2^{r+1}-2] [2r−1,2r+1−2]。同时这样的 r r r 只有 O ( log ( n + m ) ) O(\log(n+m)) O(log(n+m)) 段,配合快速幂可以在 O ( log 2 n ) O(\log^2 n) O(log2n) 的复杂度内解决本题。
K Subdivision
题意:给定一个 n n n 个点 m m m 条边的无向图 G G G,可以将其中任意一条边分裂成一条长度为任意的链(向边中插任意多个点),可以操作任意多次(也可以不操作)。问经过这样处理之后,从 1 1 1 号节点出发,至多走 k k k 步最多可以到多少个节点。 1 ≤ n ≤ 1 0 5 1\le n \le 10^5 1≤n≤105, 0 ≤ m ≤ 2 × 1 0 5 0 \le m \le 2\times 10^5 0≤m≤2×105, 0 ≤ k ≤ 1 0 9 0 \le k \le 10^9 0≤k≤109。
解法:由于需要考察从 1 1 1 出发走 k k k 步所能到的点,那么显然需要首先构造出 1 1 1 出发的 bfs 树(最短路树)。由于此题中所有边权均为 1 1 1,因而最短路树退化为 bfs 树。其中最短路树是通过 Dijkstra 算法得到的,满足 d u = d v + w d_u=d_v+w du=dv+w 的边 ( u , v , w ) (u,v,w) (u,v,w) 构成的树状子图。
考虑以下两种情况:
-
该边不在 bfs 树上。这种情况存在两个子类——该边连接了同层的两点、该边连接了不同层的两点,但是该边去除不影响图深度的计算。则这种情况下该边都可以分裂为无穷多个点,并且不影响其他点是否可以到达。
-
该边在 bfs 树上。首先需要证明一个引理:
对于从 1 1 1 号节点开始的路径 P n = { 1 , v 1 , v 2 , ⋯ , v n } P_n=\{1,v_1,v_2,\cdots,v_n\} Pn={1,v1,v2,⋯,vn},如果需要分裂边以增加点数,那么在增加点数相同的情况下,分裂 ( v n − 1 , v n ) (v_{n-1},v_n) (vn−1,vn) 最优。
证明:不失一般性的,考虑仅增加一个点。假设在 v i v_{i} vi 处有 k i k_i ki 条不在 bfs 树上的边,其中 i ∈ [ 1 , n − 1 ] i \in [1,n-1] i∈[1,n−1]。如果这时修改 ( v j , v j + 1 ) (v_j,v_{j+1}) (vj,vj+1),则会让 i ∈ [ j + 1 , n − 1 ] i \in [j+1,n-1] i∈[j+1,n−1] 所有的点连接的所有非 bfs 树边所能到达的点数减少一。那么显然当 j = n − 1 j=n-1 j=n−1 时这个损失的量最小。
考察对于 bfs 树的叶节点 u u u 及根节点到它的路径 P n = { 1 , v 1 , v 2 , ⋯ , v n − 1 , u } P_n=\{1,v_1,v_2,\cdots,v_{n-1},u\} Pn={1,v1,v2,⋯,vn−1,u},首先我们对该路径上所有边不做处理,如果这种情况下 u u u 就已经到不了了,那么这条路径上不用分裂——因为显然分裂一次创造出来的新点不过是置换了路径中更深的一个点,并且由引理可知这样还会损失非树边的答案。如果 u u u 可以到达,那么需要考虑 u u u 连接的非树边条数。如果 u u u 没有连接非树边,那么通过分裂 ( v n − 1 , u ) (v_{n-1},u) (vn−1,u) 让 u u u 变为最深的节点可以让答案增加;否则则不要执行边分裂操作,因为这样增加了 ( v n − 1 , u ) (v_{n-1},u) (vn−1,u) 路径上的答案会损失 u u u 连接的非树边的答案,哪怕只有一条边也不过是打平手。
因而建立 bfs 树,模拟该过程即可,注意没有边的情况。时间复杂度 O ( m ) O(m) O(m)。
L Three Permutations
题意:给定三个长度为 n n n 的排列 a , b , c a,b,c a,b,c, ( x , y , z ) (x,y,z) (x,y,z) 最开始为 ( 1 , 1 , 1 ) (1,1,1) (1,1,1),每过一秒变为 ( a y , b z , c x ) (a_y,b_z,c_x) (ay,bz,cx)。 q q q 次询问求变成 ( x ′ , y ′ , z ′ ) (x',y',z') (x′,y′,z′) 的最短时间。 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1≤n≤105, 1 ≤ q ≤ 1 0 5 1\le q\le 10^5 1≤q≤105。
解法:注意到每过 3 3 3 秒 ( x , y , z ) (x,y,z) (x,y,z) 变为 ( ( a ∘ b ∘ c ) x , ( b ∘ c ∘ a ) y , ( c ∘ a ∘ b ) z ) ((a\circ b\circ c)_x,(b\circ c\circ a)_y,(c\circ a\circ b)_z) ((a∘b∘c)x,(b∘c∘a)y,(c∘a∘b)z),其中 a ∘ b a \circ b a∘b 表示置换的复合运算。这时就将三个位置相互独立开来,只需要研究每一个位置的答案。
2 , 3 , 1 , 5 , 4 2,3,1,5,4 2,3,1,5,4。
一个置换是一个长度为 n n n 的数列,其中 [ 1 , n ] [1,n] [1,n] 各出现一次。如果不断重复 x → f x x \to f_x x→fx 的操作,从任意一个元素 i i i 出发,一定可以回到原始的 i i i,这个操作次数称为 i i i 的周期。如果把置换想象成一张图,即连接 i → f i i \to f_i i→fi 的有向边,那么整个置换是若干个有向环构成的图。
置换可以复合,复合后仍然是置换。置换 a a a 和置换 b b b 复合,即给定 i i i,返回 a b i a_{b_i} abi。
此时研究这三个复合置换的置换环性质,枚举初值(即从 1 1 1 秒、 2 2 2 秒、 3 3 3 秒开始计算)可以分别用 excrt 计算在 3 t , 3 t + 1 , 3 t + 2 3t,3t+1,3t+2 3t,3t+1,3t+2 秒时变成 ( x ′ , y ′ , z ′ ) (x',y',z') (x′,y′,z′) 的最短时间,取最小值。时间复杂度 O ( q log n ) O(q\log n) O(qlogn)。
M Water
题意:给两个容积分别为 A , B A,B A,B 的水杯,每次可以执行以下的四种操作之一:
- 把其中一个水杯装满水。
- 把其中一个水杯中的全部水倒掉。
- 把其中一个水杯中现有的水全部喝完。
- 把一个杯子中的水尽可能转移到另一个水杯中,水不溢出。
为让懵哥喝掉恰好 x x x 体积的水,问最少要操作几次。 T T T 组询问, 1 ≤ T ≤ 1 0 5 1\le T \le 10^5 1≤T≤105, 1 ≤ A , B ≤ 1 0 9 1 \le A,B \le 10^9 1≤A,B≤109。
解法:记 ( r , s ) = r A + s B (r,s)=rA+sB (r,s)=rA+sB,其中 r , s ∈ Z r,s\in \Z r,s∈Z。显然两个杯子和喝掉的水在任意时刻都能表示成 ( r , s ) (r,s) (r,s) 的形式,因此由裴蜀定理当 gcd ( A , B ) ∤ x \gcd(A,B)\not\mid x gcd(A,B)∣x 时答案为 − 1 -1 −1。当 A , B A,B A,B 中分别装有 ( r A , s A ) , ( r B , s B ) (r_A,s_A),(r_B,s_B) (rA,sA),(rB,sB) 水时,可以进行的操作如下:
-
装水:将 A A A 变为 ( 1 , 0 ) (1,0) (1,0) 或将 B B B 变为 ( 0 , 1 ) (0,1) (0,1);
-
倒水:将 A A A 或 B B B 变为 ( 0 , 0 ) (0,0) (0,0);
-
喝水:将 A A A 或 B B B 变为 ( 0 , 0 ) (0,0) (0,0) 且喝掉的水 + ( r A , s A ) +(r_A,s_A) +(rA,sA) 或 + ( r B , s B ) +(r_B,s_B) +(rB,sB);
-
将 A A A 转移到 B B B( B B B 转移到 A A A 同理):
-
若 ( r A + r B , s A + s B − 1 ) < 0 (r_A+r_B,s_A+s_B-1)<0 (rA+rB,sA+sB−1)<0,则 A A A 变为 ( 0 , 0 ) (0,0) (0,0) 且 B B B 变为 ( r A + r B , s A + s B ) (r_A+r_B,s_A+s_B) (rA+rB,sA+sB);
-
否则 A A A 变为 ( r A + r B , s A + s B − 1 ) (r_A+r_B,s_A+s_B-1) (rA+rB,sA+sB−1) 且 B B B 变为 ( 0 , 1 ) (0,1) (0,1);
-
下面证明: ans = max { 2 ( r 0 + s 0 ) , 2 ∣ r 0 − s 0 ∣ − 1 } \text{ans}=\max\{2(r_0+s_0),2|r_0-s_0|-1\} ans=max{2(r0+s0),2∣r0−s0∣−1}。
-
假设 x x x 可以表示成 ( r 0 , s 0 ) (r_0,s_0) (r0,s0),下证至多需要 max { 2 ( r 0 + s 0 ) , 2 ∣ r 0 − s 0 ∣ − 1 } \max\{2(r_0+s_0),2|r_0-s_0|-1\} max{2(r0+s0),2∣r0−s0∣−1} 次操作 。
-
当 r 0 ≥ 0 , s 0 ≥ 0 r_0\ge 0,s_0\ge 0 r0≥0,s0≥0 时, ans ≤ 2 ( r 0 + s 0 ) \text{ans}\le 2(r_0+s_0) ans≤2(r0+s0)。重复进行 r 0 r_0 r0 次给 A A A 倒水、从 A A A 喝水,以及 s 0 s_0 s0 次给 B B B 倒水、从 B B B 喝水即可。
-
当 r 0 s 0 < 0 r_0s_0<0 r0s0<0 时, ans ≤ 2 ∣ r 0 − s 0 ∣ − 1 \text{ans}\le 2|r_0-s_0|-1 ans≤2∣r0−s0∣−1。不妨设 r 0 > 0 , s 0 < 0 r_0>0,s_0<0 r0>0,s0<0。进行以下操作:
cntB = 0 重复 r_0 次:装满 A(操作 1)while B != (0,1) 且 A != (0,0):A 转移到 B(操作 4)if B == (0,1) and cntB < |s_0|-1:倒空 B(操作 2)cntB += 1if A != (0,0):喝 A(操作 3)
-
-
下证至少需要 max { 2 ( r 0 + s 0 ) , 2 ∣ r 0 − s 0 ∣ − 1 } \max\{2(r_0+s_0),2|r_0-s_0|-1\} max{2(r0+s0),2∣r0−s0∣−1} 次操作。
-
ans ≥ 2 ( r 0 + s 0 ) \text{ans}\ge 2(r_0+s_0) ans≥2(r0+s0)。
假设某次操作前已经喝了 ( r M , s M ) (r_M,s_M) (rM,sM) 水,此时两个杯子中有水量 ( r A , s A ) , ( r B , s B ) (r_A,s_A),(r_B,s_B) (rA,sA),(rB,sB),记 m = r M + s M m=r_M+s_M m=rM+sM, a = r A + s A a=r_A+s_A a=rA+sA, b = r B + s B b=r_B+s_B b=rB+sB,构造函数 f ( m , a , b ) = 2 m + max { 2 a − 1 , 0 } + max { 2 b − 1 , 0 } f(m,a,b)=2m+\max\{2a-1,0\}+\max\{2b-1,0\} f(m,a,b)=2m+max{2a−1,0}+max{2b−1,0},注意该函数仅需要满足操作一次后函数值增大 1 1 1,且最后可以变化到 2 m 2m 2m,这里仅给出其中一个符合条件的示例函数。可以证明在当前局面下进行任意操作后 f ( m ′ , a ′ , b ′ ) ≤ f ( m , a , b ) + 1 f(m',a',b')\le f(m,a,b)+1 f(m′,a′,b′)≤f(m,a,b)+1。由于初始状态为 f ( 0 , 0 , 0 ) = 0 f(0,0,0)=0 f(0,0,0)=0,目标状态 f ( r 0 + s 0 , a , b ) min = 2 ( r 0 + s 0 ) f(r_0+s_0,a,b)_{\min}=2(r_0+s_0) f(r0+s0,a,b)min=2(r0+s0),因此操作次数不少于 2 ( r 0 + s 0 ) 2(r_0+s_0) 2(r0+s0)。
-
ans ≥ 2 ∣ r 0 − s 0 ∣ − 1 \text{ans}\ge 2|r_0-s_0|-1 ans≥2∣r0−s0∣−1。
当 r 0 − s 0 ≥ 0 r_0-s_0\ge 0 r0−s0≥0。记 m = r M − s M m=r_M-s_M m=rM−sM, a = r A − s A a=r_A-s_A a=rA−sA, b = r B − s B b=r_B-s_B b=rB−sB,构造函数 f ( m , a , b ) = 2 m + max { 2 a − 1 , 0 } + max { 2 b , − 1 } f(m,a,b)=2m+\max\{2a-1,0\}+\max\{2b,-1\} f(m,a,b)=2m+max{2a−1,0}+max{2b,−1}。注意该函数仅需要满足操作一次后函数值增大 1 1 1,且最后可以变化到 2 m − 1 2m-1 2m−1,这里仅给出其中一个符合条件的示例函数。可以证明进行任意操作后 f ( m ′ , a ′ , b ′ ) ≤ f ( m , a , b ) + 1 f(m',a',b')\le f(m,a,b)+1 f(m′,a′,b′)≤f(m,a,b)+1。由于初始状态为 f ( 0 , 0 , 0 ) = 0 f(0,0,0)=0 f(0,0,0)=0,目标状态 f ( r 0 + s 0 , a , b ) min = 2 ( r 0 − s 0 ) − 1 f(r_0+s_0,a,b)_{\min}=2(r_0-s_0)-1 f(r0+s0,a,b)min=2(r0−s0)−1,因此操作次数不少于 2 ( r 0 − s 0 ) − 1 2(r_0-s_0)-1 2(r0−s0)−1。
当 r 0 − s 0 < 0 r_0-s_0<0 r0−s0<0 时同理可证操作次数不少于 2 ( s 0 − r 0 ) − 1 2(s_0-r_0)-1 2(s0−r0)−1。
一种更加简单的证明是,将 ( r 0 , s 0 ) (r_0,s_0) (r0,s0) 理解为一种操作。如果存在另一种操作比现有的 max { 2 ( r 0 + s 0 ) , 2 ∣ r 0 − s 0 ∣ − 1 } \max\{2(r_0+s_0),2|r_0-s_0|-1\} max{2(r0+s0),2∣r0−s0∣−1} 操作更少,那么一定是
- 如果 r 0 , s 0 r_0,s_0 r0,s0 都是正数,则一定让 A , B A,B A,B 中大的那一个的系数更大(贪心的增加一次多喝水的量可以减少总次数)。
- 如果 r 0 r_0 r0 为正 s 0 s_0 s0 为负,则一定减少负数的系数(即被倒出的水量减少,这样让正的系数也可以减少)。
但是不难发现,变化了 r 0 r_0 r0 和 s 0 s_0 s0 对应的次数和上面这个表达式的次数是相同的。即, A , B A,B A,B 系数变化前后的次数表达式仍然是关于 r 0 , s 0 r_0,s_0 r0,s0 相同的函数表达式。因而不存在另一种更小的方法使得操作次数比 max { 2 ( r 0 + s 0 ) , 2 ∣ r 0 − s 0 ∣ − 1 } \max\{2(r_0+s_0),2|r_0-s_0|-1\} max{2(r0+s0),2∣r0−s0∣−1} 小。
-
综上 ans = max { 2 ( r 0 + s 0 ) , 2 ∣ r 0 − s 0 ∣ − 1 } \text{ans}=\max\{2(r_0+s_0),2|r_0-s_0|-1\} ans=max{2(r0+s0),2∣r0−s0∣−1}。用 exgcd 求出离原点较近的 ( r 0 , s 0 ) (r_0,s_0) (r0,s0),并对附近的 ( r 0 + k B , s 0 − k A ) (r_0+kB,s_0-kA) (r0+kB,s0−kA) 取 min \text{min} min 即可。每组数据复杂度 O ( log x ) O(\log x) O(logx)。