类欧几里得算法

类欧几里得算法


我们知道欧几里得算法求\(\tt gcd\),过程为\(\gcd(x,y)=\gcd(x\%y,y)\)

我们不难证明,时间复杂度为\(O(\log_2n)\)

而有一类特殊的前缀和问题,可以通过一系列推导使得其满足欧几里得算法的递归式,从而简化或证明其时间复杂度为\(O(\log_2n)\),我们称此类算法为类欧几里得算法


\(\rm eg.1\)

已知\(a,b,c,n\leq10^9\),求\(\sum_{i=0}^n\lfloor{ai+b\over c}\rfloor\)

我们不难发现,这种变量在分子上的分段函数是难以进行整除分块的,这时只能使用类欧几里得算法

我们令\(f(a,b,c,n)=\sum_{i=0}^n\lfloor{ai+b\over c}\rfloor\)

则我们进行分类讨论:

  1. \(\max(a,b)\geq c\)

    \[\begin{align} f(a,b,c,n)&=\sum_{i=0}^n\lfloor{ai+b\over c}\rfloor\\ &=\sum_{i=0}^n\left(\left\lfloor{(a\%c)i+(b\%c)\over c}\right\rfloor+i \left\lfloor{a\over c}\right\rfloor+\left\lfloor{b\over c}\right\rfloor\right)\\ &=\frac{n(n+1)}{2}\left\lfloor\frac{a}{c}\right\rfloor+(n+1)\left\lfloor\frac{b}{c}\right\rfloor+\sum_{i=0}^n\left\lfloor{(a\%c)i+(b\%c)\over 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\%c,b\%c,c,n) \end{align} \]

  2. \(\max(a,b)\leq c,\)\(m=\lfloor\frac{an+b}{c}\rfloor\)

    \[\begin{align} f(a,b,c,n)&=\sum_{i=0}^n\lfloor{ai+b\over c}\rfloor\\ &=\sum_{i=0}^n\sum_{j=1}^m\left[j\leq \lfloor\frac{ai+b}{c}\rfloor\right]\\ &=\sum_{i=0}^n\sum_{j=1}^m\left[\lfloor\frac{ai+b-cj}{c}\rfloor\geq 0\right]\\ &=\sum_{i=0}^n\sum_{j=1}^m\left[ai+b-cj\geq 0\right]\\ &=\sum_{i=0}^n\sum_{j=0}^{m-1}\left[ai+b\geq cj+c\right]\\ &=\sum_{i=0}^n\sum_{j=0}^{m-1}\left[ai+b+1> cj+c\right]\\ &=\sum_{i=0}^n\sum_{j=0}^{m-1}\left[i>\left\lfloor{cj+c-b-1\over a}\right\rfloor\right]\\ &=\sum_{i=0}^{m-1}\left(n-\left\lfloor{cj+c-b-1\over a}\right\rfloor\right)\\ &=nm-f(c,c-b-1,a,m-1) \end{align} \]

至此,我们便得到了同\(\tt gcd\)时间复杂度的算法

其它的结构以后再更,咕咕咕~~

posted @ 2021-03-26 19:32  ファイナル  阅读(87)  评论(0)    收藏  举报