类欧几里得算法学习笔记
ABC313,逆天
为了 ABC313G,来学一下最简单形式的类欧算法。
类欧几里得算法似乎和欧几里得唯一的共性是复杂度证明。
形式化的,我们需要计算 \(f(a,b,c,n)=\sum_{i=0}^n\lfloor \dfrac{ai+b}{c}\rfloor\)。
首先,如果 \(a\ge c\) 或者 \(b\ge c\),
\[f(a,b,c,n)=\sum_{i=0}^n(\lfloor \dfrac{a}{c}\rfloor i+\lfloor \dfrac{b}{c}\rfloor+\lfloor \dfrac{(a\bmod c)i+b\bmod c}{c}\rfloor)
\]
\[=\lfloor \dfrac{a}{c}\rfloor\dfrac{n(n+1)}{2}+\lfloor \dfrac{b}{c}\rfloor (n+1)+f(a\bmod c,b\bmod c,c,n)
\]
否则,考虑
\[\sum_{i=0}^n\lfloor \dfrac{ai+b}{c}\rfloor=\sum_{i=0}^n\sum_{j=1}^{\lfloor \tfrac{ai+b}{c}\rfloor} 1
\]
\[=\sum_{j=0}^{\lfloor \tfrac{an+b}{c}\rfloor-1}\sum_{i=0}^{n} [j<\lfloor \dfrac{ai+b}{c}\rfloor]
\]
\[j<\lfloor \dfrac{ai+b}{c}\rfloor \Rightarrow j+1\le \dfrac{ai+b}{c}\Rightarrow cj+c\le ai+b
\]
\[\Rightarrow cj+c-b-1<ai\Rightarrow \lfloor\dfrac{cj+c-b-1}{a}\rfloor\lt i
\]
所以,
\[f(a,b,c,n)=\sum_{j=0}^{\lfloor \tfrac{an+b}{c}\rfloor-1}\sum_{i=\lfloor\tfrac{cj+c-b-1}{a}\rfloor+1}^{n} 1
\]
设 \(m=\lfloor \dfrac{an+b}{c}\rfloor\)
\[=\sum_{j=0}^{m-1}(n-\lfloor\dfrac{cj+c-b-1}{a}\rfloor) =nm-f(c,c-b-1,a,m-1)
\]
而我们发现,\(a,c\) 处在“互相取模,交换”的循环中,最终会来到 \(a=0\) 或者 \(n=0\),这就好解决了。