各类欧几里得算法
注意:本博客公式较多,字体小,建议放大观看。
辗转相除法
更相减损术
欧几里得算法
注意到当 \(a>b\) 时 \(a\bmod b<\frac{1}{2}a\),所以至多递归 \(O(\log a)\) 层。
扩展欧几里得算法
求不定方程 \(ax+by=m\) 的一组整数解。
sol:
该方程有解当且仅当 \(\gcd(a,b)\mid m\),下面假设 \(d=\gcd(a,b)\),则原方程可化为 \(ax+by=d\)。
设:
假设我们已经求出 \(x_1\) 和 \(y_1\),考虑得到 \(x\) 和 \(y\)。
由欧几里得定理可知:\(\gcd(a,b)=\gcd(b,a\bmod b)\)。
所以:\(ax+by=bx_1+(a\bmod b)y_1\)。
又因为:
所以:
整理得:
对比两侧系数即得到:
递归调用即可,边界是 \(b=0\) 时,此时取 \(x=1,y=0\)。
类欧几里得算法
给定 \(n,a,b,c\),分别求:
sol:
令 \(f(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\),考虑 \(a,b,c\) 的关系。
-
若 \(a\ge c\) 或 \(b\ge c\),则把 \(a,b\) 对 \(c\) 取模:
\(\begin{aligned}f(a,b,c,n)&=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\sum\limits_{i=0}^n\left\lfloor\frac{(\left\lfloor\frac{a}{c}\right\rfloor c+a\bmod c)i+(\left\lfloor\frac{b}{c}\right\rfloor c+b\bmod c)}{c}\right\rfloor\\&=\frac{n(n+1)}{2}\left\lfloor\frac{a}{c}\right\rfloor+(n+1)\left\lfloor\frac{b}{c}\right\rfloor+\sum\limits_{i=0}^n\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor\\&=\frac{n(n+1)}{2}\left\lfloor\frac{a}{c}\right\rfloor+(n+1)\left\lfloor\frac{b}{c}\right\rfloor+f(a\bmod c,b\bmod c,c,n)\end{aligned}\) -
若 \(a<c\) 且 \(b<c\):
\(\begin{aligned}f(a,b,c,n)&=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\sum\limits_{i=0}^n\sum\limits_{j=0}^{\left\lfloor\frac{ai+b}{c}\right\rfloor-1}1\\&=\sum\limits_{j=0}^{\left\lfloor\frac{an+b}{c}\right\rfloor-1}\sum\limits_{i=0}^n\left[j<\left\lfloor\frac{ai+b}{c}\right\rfloor\right]\end{aligned}\)
把 \(j<\left\lfloor\frac{ai+b}{c}\right\rfloor\) 这个条件转化一下:
\(\begin{aligned}j<\left\lfloor\frac{ai+b}{c}\right\rfloor&\Longleftrightarrow j+1\le\left\lfloor\frac{ai+b}{c}\right\rfloor\\&\Longleftrightarrow j+1\le\frac{ai+b}{c}\\&\Longleftrightarrow jc+c-b-1<ai\\&\Longleftrightarrow\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor<i\end{aligned}\)
令 \(m=\left\lfloor\frac{an+b}{c}\right\rfloor\),那么原式化为:
\(\begin{aligned}\sum\limits_{j=0}^{m-1}\sum\limits_{i=0}^n\left[j<\left\lfloor\frac{ai+b}{c}\right\rfloor\right]&=\sum\limits_{j=0}^{m-1}\sum\limits_{i=0}^n\left[i>\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor\right]\\&=\sum\limits_{j=0}^{m-1}\left(n-\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor\right)\\&=nm-f(c,c-b-1,a,m-1)\end{aligned}\)
两种情况递归即可,复杂度同欧几里得算法,为 \(O(\log n)\)。
现在,我们还需要求:\(g(a,b,c,n)=\sum\limits_{i=0}^ni\left\lfloor\frac{ai+b}{c}\right\rfloor\) 和 \(h(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\)。
先求 \(g\),同样分两种情况。
-
若 \(a\ge c\) 或 \(b\ge c\):
与 \(f\) 类似,推导出 \(g(a,b,c,n)=\frac{n(n+1)(2n+1)}{2}\left\lfloor\frac{a}{c}\right\rfloor+\frac{n(n+1)}{2}\left\lfloor\frac{b}{c}\right\rfloor+g(a\bmod c,b\bmod c,c,n)\)。 -
若 \(a<c\) 且 \(b<c\):
\(\begin{aligned}g(a,b,c,n)&=\sum\limits_{i=0}^ni\left\lfloor\frac{ai+b}{c}\right\rfloor\\&=\sum\limits_{j=0}^{m-1}\sum\limits_{i=0}^ni\left[j<\left\lfloor\frac{ai+b}{c}\right\rfloor\right]\end{aligned}\)
方便起见,设 \(t=\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor\),则:
\(\begin{aligned}g(a,b,c,n)&=\sum\limits_{j=0}^{m-1}\sum\limits_{i=0}^ni[i>t]\\&=\sum\limits_{j=0}^{m-1}\frac{1}{2}(t+n+1)(n-t)\\&=\frac{1}{2}\left[mn(n+1)-\sum\limits_{j=0}^{m-1}t^2-\sum\limits_{j=0}^{m-1}t\right]\\&=\frac{1}{2}\left[m n(n+1)-h(c,c-b-1,a,m-1)-f(c,c-b-1,a,m-1)\right]\end{aligned}\)
再求 \(h\),也是最复杂的一个:
- 若 \(a\ge c\) 或 \(b\ge c\):
\(\begin{aligned}h(a,b,c,n)&=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\&=\sum\limits_{i=0}^n\left(\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor+\left\lfloor\frac{(a\bmod c)i+b\bmod c}{c}\right\rfloor\right)^2\\&=\frac{n(n+1)(2n+1)}{6}\left\lfloor \frac{a}{c}\right\rfloor^2+(n+1)\left\lfloor \frac{b}{c}\right\rfloor^2+n(n+1)\left\lfloor \frac{a}{c}\right\rfloor\left\lfloor \frac{b}{c}\right\rfloor\\&\ \ \ \ +2\left\lfloor \frac{a}{c}\right\rfloor g(a\bmod c,b\bmod c,c,n)+2\left\lfloor \frac{b}{c}\right\rfloor f(a\bmod c,b\bmod c,c,n)\\&\ \ \ \ +h(a\bmod c,b\bmod c,c,n)\end{aligned}\) - 若 \(a<c\) 且 \(b<c\):
同样地,令 \(m=\left\lfloor\frac{an+b}{c}\right\rfloor,t=\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor\)。
将 \(n^2\) 写成 \(\left(2\sum\limits_{i=1}^ni\right)-n\),则:
\(\begin{aligned}h(a,b,c,n)&=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\&=\sum\limits_{i=0}^n\left(\left(2\sum\limits_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor}j\right)-\left\lfloor\frac{ai+b}{c}\right\rfloor\right)\\&=\left(2\sum\limits_{i=0}^n\sum\limits_{j=0}^{\left\lfloor\frac{ai+b}{c}\right\rfloor-1}j+1\right)-f(a,b,c,n)\\&=\left(2\sum\limits_{j=0}^{m-1}\sum\limits_{i=0}^n(j+1)\left[j<\left\lfloor\frac{ai+b}{c}\right\rfloor\right]\right)-f(a,b,c,n)\\&=\left(2\sum\limits_{j=0}^{m-1}(j+1)\sum\limits_{i=0}^n[i>t]\right)-f(a,b,c,n)\\&=\left(2\sum\limits_{j=0}^{m-1}(j+1)(n-t)\right)-f(a,b,c,n)\\&=nm(m+1)-2f(c,c-b-1,a,m-1)\\&\ \ \ \ -2g(c,c-b-1,a,m-1)-f(a,b,c,n)\end{aligned}\)
于是 \(f,g,h\) 相互递归调用即可。

浙公网安备 33010602011771号