类欧几里得算法学习笔记

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\),这就好解决了。

posted @ 2023-08-06 15:43  jucason_xu  阅读(23)  评论(1编辑  收藏  举报