Exgcd 专题
Exgcd 专题
Problem A. P3421 [POI 2005] SKO-Knights
\(n\) 个向量一定可以用 \(\vec{i},\vec{j}\) 替代,其中 \(\vec{i}\) 是竖直向量,\(\vec{j}\) 无要求。
数学归纳法,\(n=1\) 显然成立,令 \(\vec{i}=(0,0),\vec{j}=\vec{a_1}\) 即可。
当 \(n>1\) 时,假设前 \(n-1\) 个等价于 \(\vec{i}=(0,A),\vec{j}=(x,B)\)。
现加入向量 \(\vec{a_n}=(x_n,y_n)\),\(A\) 变为 \(\gcd(A,\frac{B{\rm lcm}(x,x_n)}{x}-\frac{{y_n\rm lcm(x,x_n)}}{x_n})\)。\(x\) 变为 \(k_1x+k_2x_n=x\) 有解的最小非负整数,即 \(\gcd(x,x_n)\),然后 \(B\) 变为 \(k_1B+k_2y_n\)。
Problem B. P3518 [POI 2011] SEJ-Strongbox
若 \(x\) 为密码,那么 \(2x \bmod n, 3x \bmod n,...\) 都会是密码。
引理 1: 若 \(x\) 为密码,那么 \(\gcd(x,n)\) 也必定是密码。
列出同余方程 \(kx \equiv\gcd(x,n) \pmod{n}\),化为 \(kx+pn=\gcd(x,n)\),方程必定有解。
引理 2: 若 \(x,y\) 为密码,那么 \(\gcd(x,y)\) 也必定是密码。
关于 \(p,q\) 的方程 \(px+qy=\gcd(x,y)\) 一定有整数解。
引理 3: 设最小的密码为 \(x\),其余密码一定是 \(x\) 的若干正整数倍。
反证法。假设最小的密码是 \(x\),存在一个密码 \(y\) 不是 \(x\) 的倍数。
那么 \(\gcd(x,y)<x\),与 \(x\) 最小矛盾。
有了上面 3 个引理,题意转化为:求最小的 \(x\),满足 \(x\mid \gcd(n,m_k)\),且 \(\forall i \in [1,k-1], x\nmid m_i\)。答案即为 \(\frac{n}{x}\)。
设 \(d=\gcd(n,m_k)\)。暴力求解的时间复杂度为 \(d\) 的因子个数乘上 \(m\),无法通过。
那么 正难则反,考虑枚举 \(m_i\) 的因子。首先 对于每一个 \(m_i\),对其因子集合与 \(d\) 的因子集合取交集,也就是 \(m_i \leftarrow \gcd(m_i,d)\)。此时有 \(m_i \mid d\)。
接下来可以发现 \(d\) 的不同质因子数量不会超过 \(20\) 个,于是可以由此入手。
对于一个 \(m_i\),不断用 \(d\) 的质因子除 \(m_i\),直到 \(m_i\) 变为 \(1\),并标记途中的所有数字。
利用记忆化,我们就能保证每一个数字只被标记一次。时间复杂度变为 \(\mathcal{O(d(d)\times\omega(d))}\),可以接受。
Problem C. P3543 [POI 2012] WYR-Leveling Ground
考 exgcd 的深层理解,牛题。
转差分数组上操作,设 \(c_i=A_i-A_{i-1}\)。那么需要满足
若某个 \(c_i\) 不满足 \(gcd(a,b)\mid c_i\),就无解,否则一定有解。
答案为 \(\frac 1 2 \sum(|x_i|+|y_i|)\)。
设 \(d=\gcd(a,b)\)。先不考虑 \(\sum x_i,\sum y_i\) 的限制,对每个 \(i\) 求出 \(|x_i|+|y_i|\) 最小值。
由 \(x=x_0+\frac{kb}{d},y=y_0-\frac{ka}{d}\),\(|x_i|+|y_i|\) 是关于 \(k\) 的两个一次绝对值函数相加,最小值在两个断点上。所以求出 \(x_i,y_i\) 的最小非负整数解、最大非正整数解,四种情况取 \(\min\) 即可。
然后进行调整。由 \(a(\sum x_i)+b(\sum y_i)=\sum c_i=0\),当 \(\sum x_i=0\) 时 \(\sum y_i\) 必定为 \(0\),所以 只需考虑 \(x_i\)。又得到 \(\frac b d\mid (\sum x_i),\frac a d \mid (\sum y_i)\),所以 一定能调整成功。
若 \(\sum x_i>0\),那么 把 \(x_i>0\) 的插进堆里,每次选代价最小的出来。\(\sum x_i<0\) 同理。
但调整次数还没有保证,所以 需要得到调整前 \(\sum x_i\) 的范围。调整前,每个 \(i\) 要么让 \(|x_i|\) 最优,要么让 \(|y_i|\) 最优。第二种情况肯定更劣,当所有 \(i\) 都是第二种情况时,\(-\frac a d < y_i < \frac a d\)。而 \(x_i=\frac{c_i-by_i}{a}\),则 \(\frac {c_i}{a}-\frac b d < x_i< \frac {c_i}a + \frac d b\)。
而 \(\sum c_i=0\),所以 \(-\frac{nb}{d}<\sum x_i < \frac{nb}{d}\),只需要调整不超过 \(n\) 轮。
https://www.luogu.com.cn/record/198756207
Problem D. CF516E Drazil and His Happy Friends
设 \(x=i\bmod n,y=i\bmod m\)。\(x=y\) 能成立需要满足 \(x\equiv y \pmod{\gcd(n,m)}\)。
设 \(d=\gcd(n,m),n'=\frac n d,m'=\frac m d\)。所以按 \(\bmod d\) 的值分为 \(d\) 组,若一组内没有初始快乐的就无解。否则,因为 \(n'\perp m'\),所以每一组内每一对 \(x,y\) 都会出来玩一次,一定能全部快乐。
对每一组考虑。对男生女生分别考虑,二者取 \(\max\) 即可。先考虑男生,女生对称考虑即可。
若男生 \(i\) 在某一天变得快乐,那么 \((i+m)\bmod n\) 在 \(m\) 天后一定快乐。
若男生或女生 \(i\) 初始快乐,就把 \(i\bmod n\) 男生标记为初始快乐。特判掉一开始就全部被标记的情况。对于一个没有被标记的男生,当他变得快乐时,对应的女生一定不是第一次出来玩,所以上面的条件可以覆盖所有情况。
那么就可以同余最短路建模了。但点数过多,需要削减。从 \(0\) 开始,以 \(m\) 为步长给每个男生编号,按编号排序。只有两类点有用:初始快乐的,\((i+m)\bmod n\) 初始快乐的。
每个点的编号可以 exgcd 求。男女生各自跑一遍最短路即可。
Bonus:实际上不需要男女生各自跑一遍,只需要考虑人数较多的一边即可。
假设 \(n\ge m\)。所有的男生都快乐时,除非天数 \(<m\),否则所有的女生也都快乐。
证明考虑最后的 \(m\) 天,每个女生都出来玩了,而由于 \(m\) 天结束后男生都快乐,女生也必定快乐。

浙公网安备 33010602011771号