学习笔记 - 类欧几里得算法

考虑以下问题:求 \(f(x)=\frac{ax+b}{c}\)\([0,n]\) 下整点的个数。

问题等价于求出:

\[\sum_{i=0}^n \lfloor\frac{ax+b}{c}\rfloor \]

\(O(n)\) 十分简单,尝试更优?

前置

首先我们先提出两种变换,这两种变换显而易懂,但是是我们快速计算的根基:

求和变换:一个数转换成若干个 \(1\) 相加:

\[x=\sum_{i=1}^x 1 \]

限制变换:交换求和指标的变换:

\[\sum_{i=1}^n\sum_{j=1}^i 1=\sum_{j=1}^n\sum_{i=1}^n [j\le i] \]

Part 1

例题

\(O(\log n)\) 求出引子中的式子

对式子应用求和变换和限制变换:

\[\begin{aligned} f(a,b,c,n)=\sum_{i=0}^n\lfloor\frac {ai+b}{c}\rfloor & =\sum^n_{i=0}\sum_{j=0}^{\lfloor\frac{ai+b}{c}\rfloor-1}1 \\ & =\sum^{\lfloor\frac {an+b}{c}\rfloor-1}_{j=0} \sum_{i=0}^n 1[j<\lfloor\frac{ai+b}{c}\rfloor] \end{aligned} \]

考察不等式:

\[\begin{aligned} j<\lfloor \frac{ai+b}{c}\rfloor & \to j\le \lfloor \frac{ai+b}{c}\rfloor -1\\ & \to jc+c\le ai+b\\ & \to jc+c-b-1 < ai\\ & \to i>\lfloor\frac{jc+c-b-1}{a}\rfloor \end{aligned} \]

下文定义 \(m=\lfloor\frac{an+b}{c}\rfloor\),逆用求和变换:

\[\begin{aligned} \sum_{i=0}^n\lfloor\frac {ai+b}{c}\rfloor & = \sum^{m-1}_{j=0}\sum^n_{i=0}1[i>\lfloor\frac {jc+c-b-1}{a}\rfloor] \\ &=\sum_{j=0}^{m-1}\sum_{i=\lfloor\frac{jc+c-b-1}{a}\rfloor+1}^n 1\\ & =\sum_{j=0}^{m-1} n-\lfloor\frac{jc+c-b-1}{a}\rfloor \\ &= nm-\sum_{j=0}^{m-1}\lfloor\frac{jc+c-b-1}{a}\rfloor \\ &= nm - f(c,c-b-1,a,m-1) \end{aligned} \]

递归计算即可,时间复杂度 \(O(\log n)\)

Part 2

计算 \(\displaystyle g(a,b,c,n)=\sum_{i=0}^n \lfloor\frac{ai+b}{c}\rfloor^2,h(a,b,c,n)=\sum_{i=0}^n i\lfloor\frac{ai+b}{c}\rfloor\)

平方变换:将一个数的平方进行变换:

\[n^2=2\sum^n_{i=1} i-n \]

首先我们先化简 \(g(a,b,c,n)\),使用平方变换:

\[\begin{aligned} g(a,b,c,n) & = \sum^n_{i=0} (2 \sum_{j=1}^{\lfloor\frac{ai+b}{c}\rfloor} j - \lfloor\frac{ai+b}{c}\rfloor)\\ & = 2\sum^n_{i=0} \sum_{j=1}^{\lfloor\frac{ai+b}{c}\rfloor} j -\sum^n_{i=0} \lfloor\frac{ai+b}{c}\rfloor\\ & = 2\sum^n_{i=0} \sum_{j=1}^{\lfloor\frac{ai+b}{c}\rfloor} j - f(a,b,c,n) \end{aligned} \]

接下来针对前面的式子,使用限制变换,下文我们定义 \(m=\lfloor\frac{an+b}{c}\rfloor,T=\lfloor\frac{jc+c-b-1}{a}\rfloor\)

\[\begin{aligned} 2\sum^n_{i=0} \sum_{j=1}^{\lfloor\frac{ai+b}{c}\rfloor} j & = 2\sum^n_{i=0} \sum_{j=0}^{\lfloor\frac{ai+b}{c}\rfloor-1} (j+1)\\ & = 2\sum_{j=0}^{m-1}\sum_{i=0}^n (j+1) [j< \lfloor\frac{ai+b}{c}\rfloor]\\ & = 2\sum_{j=0}^{m-1}\sum_{i=0}^n (j+1) [i>T]\\ & = 2\sum_{j=0}^{m-1}\sum_{i=T+1}^n (j+1)\\ & = 2\sum_{j=0}^{m-1} (j+1)(n-T)\\ & = 2\sum_{j=0}^{m-1} n(j+1)-2\sum_{j=0}^{m-1}(j+1)T\\ & = nm(m+1)-2\sum_{j=0}^{m-1}jT-2\sum_{j=0}^{m-1}T\\ & = nm(m+1)-2h(c,c-b-1,a,m-1)-2f(c,c-b-1,a,m-1) \end{aligned} \]

递归计算做到 \(O(\log n)\)

接下来考虑 \(h(a,b,c,n)\),同上文的定义:

\[\begin{aligned} \sum_{i=0}^n i\lfloor\frac{ai+b}{c}\rfloor & = \sum_{i=0}^n \sum_{j=0}^{\lfloor\frac{ai+b}{c}\rfloor-1} i\\ & = \sum_{j=0}^{m-1}\sum_{i=0}^n i[j<\lfloor\frac{ai+b}{c}\rfloor]\\ & = \sum_{j=0}^{m-1}\sum_{i=0}^n i[i>T]\\ & = \sum_{j=0}^{m-1}\sum_{i=T+1}^n i\\ & = \sum_{j=0}^{m-1} \frac{n(n+1)}{2}-\frac{T(T+1)}{2}\\ & = \frac 1 2 mn(n+1)-\frac 1 2 \sum_{j=0}^{m-1} T(T+1)\\ & = \frac 1 2 mn(n+1)-\frac 1 2 \sum_{j=0}^{m-1} T^2- \frac 1 2\sum_{j=0}^{m-1} T\\ & = \frac 1 2 mn(n+1)-\frac 1 2 g(c,c-b-1,a,m-1)-\frac 1 2 f(c,c-b-1,a,m-1) \end{aligned} \]

递归计算做到 \(O(\log n)\)

细枝末节

类似于扩展欧几里得,我们需要处理 \(a>c\) 或者 \(b>c\) 的情况。考虑这样的情况(这里只给出答案):

\[\begin{aligned} f(a,b,c,n) & = f(a\bmod c,b\bmod c,c,n)+(n+1)\lfloor\frac{b}{c}\rfloor+\frac 1 2 n(n+1)\lfloor\frac a c\rfloor\\ g(a,b,c,n) & = g(a\bmod c,b\bmod c,c,n)+2\lfloor\frac{a}{c}\rfloor h(a\bmod c,b\bmod c,c,n)+2\lfloor\frac{b}{c}\rfloor f(a\bmod c,b\bmod c,c,n)+\frac 1 6 n(n+1)(2n+1)\lfloor\frac a c\rfloor^2 +n(n+1)\lfloor\frac a c\rfloor \lfloor\frac b c\rfloor+(n+1)\lfloor\frac b c\rfloor^2\\ h(a,b,c,n) & = h(a\bmod c,b\bmod c,c,n)+\frac 1 6 n(n+1)(2n+1)\lfloor\frac a c\rfloor+\frac 1 2 n(n+1)\lfloor\frac b c\rfloor \end{aligned} \]

同样的请注意边界 \(a=0\) 的情况,这种情况 so easy,就不展开了。

习题

P5171 Earthquake

\(ax+by\le c\to y\le \frac{-ax+c}{b}\)

等价于求:

\[\sum_{i=0}^{\lfloor\frac c a \rfloor}\lfloor\frac{-ai+c}{b}\rfloor+1 = 1+\lfloor\frac c a\rfloor+\sum_{i=0}^{\lfloor\frac a c \rfloor}\lfloor\frac{-ai+c}{b}\rfloor \]

一次项为负数不是很好处理,考虑对内部进行一些简单变换:

\[\begin{aligned} \sum_{i=0}^{\lfloor\frac c a \rfloor}\lfloor\frac{-ai+c}{b}\rfloor & = \sum_{i=0}^{\lfloor\frac{c}{a}\rfloor} \lfloor\frac{(b-a)i+c}{b}\rfloor-i\\ & = -\frac 1 2(\lfloor\frac{c}{a}\rfloor)(\lfloor\frac{c}{a}\rfloor+1)+\sum_{i=0}^{\lfloor\frac{c}{a}\rfloor} \lfloor\frac{(b-a)i+c}{b}\rfloor \end{aligned} \]

\(b-a\) 只需 swap(a,b) 即可,用类欧做一做就行了。

51nod 1132 覆盖数字的数量 V2

首先先差分转成 \([0,n]\) 内的问题。

考虑 \(\gcd(a,b)=1\) 的情况,不满足这种情况的可以同时除以 \(\gcd(a,b)\),注意到 \(n>(a-1)(b-1)\) 没意义(小凯的疑惑),而 \(\le (a-1)(b-1)\) 的部分最多一组非负整数解,套用上题做法即可。

CTT2014 Sum

UOJ hack 数据还没过,不管了,假装自己过了。

先针对 \(\sqrt{r}\) 进行讨论,\(\sqrt{r}\) 是整数的情况是平凡的,接下来重点考虑为无理数的情况。

注意到 \((-1)^x=1-2(x\bmod 2)=1-2x+4\lfloor\frac x 2\rfloor\),用这个式子进行替换得到:

\[\begin{aligned} \sum_{d=1}^n (-1)^{\lfloor d\sqrt{r}\rfloor} & = \sum_{d=1}^n 1-2\lfloor d\sqrt{r}\rfloor + 4\lfloor\frac{d\sqrt{r}}{2}\rfloor\\ & = n-2\sum_{d=1}^n\lfloor d\sqrt{r}\rfloor+4\sum_{d=1}^n\lfloor \frac{d\sqrt{r}}{2} \rfloor \end{aligned} \]

依照类欧的套路,设 \(\sum f(a,b,c,n)=\sum_{i=1}^n\lfloor i\times \frac{a\sqrt{r}+b}{c}\rfloor\),则原式变为:

\[n-2f(1,0,1,n)+4f(1,0,2,n) \]

接下来尝试推导 \(f(a,b,c,n)\),为了下面说明方便,设 \(x=\sqrt{r},t=\frac {ax+b}c,p=\lfloor t\rfloor\)

边界是 \(n=0\),此时 \(f(a,b,c,n)=0\)。注意可以将 \(a,b,c\) 同除以最大公约数。

我们尝试将 \(p\)\(t\) 里面分离开来,有:

\[\begin{aligned} f(a,b,c,n) & = \sum^n_{i=1}\lfloor ti\rfloor\\ & = \sum^n_{i=1} \lfloor (t-p)i\rfloor+pi\\ & = \frac 1 2 n(n+1)p+\sum^n_{i=1}\lfloor i\times \frac{ax+b-cp}{c}\rfloor\\ & = \frac 1 2 n(n+1)p+f(a,b-cp,c,n)\\ \end{aligned} \]

注意到这个式子在 \(p=0\) 的时候屁用没有,所以需要考虑 \(p=0\)\(0 < t <1\) 的情况。

应用求和变换与限制变换即可:

\[\begin{aligned} f(a,b,c,n) & = \sum^n_{i=1}\sum_{j=1}^{\lfloor ti\rfloor} 1\\ & = \sum_{j=1}^{\lfloor tn\rfloor}\sum^n_{i=1}[j< ti]\\ & = \sum_{j=1}^{\lfloor tn\rfloor}\sum^n_{i=1}[i> \lfloor \frac{j}{t}\rfloor]\\ & = \sum_{j=1}^{\lfloor tn\rfloor} n-\lfloor \frac{j}{t}\rfloor\\ & = n\lfloor tn\rfloor-\sum_{j=1}^{\lfloor tn\rfloor} \frac{j}{t}\\ & = n\lfloor tn\rfloor-\sum_{j=1}^{\lfloor tn\rfloor} j\frac{c}{ax+b} \end{aligned} \]

这个时候分母出现了 \(x\),并不符合 \(f\) 的形式,考虑乘上 \(ax+b\) 的共轭表达式:

\[\begin{aligned} f(a,b,c,n) & = n\lfloor tn\rfloor-\sum_{j=1}^{\lfloor tn\rfloor} j\frac{c(ax-b)}{(ax+b)(ax-b)}\\ & = n\lfloor tn\rfloor-\sum_{j=1}^{\lfloor tn\rfloor} j\frac{acx-bc)}{a^2r-b^2}\\ & = n\lfloor tn\rfloor-f(ac,-bc,a^2r-b^2,\lfloor tn\rfloor) \end{aligned} \]

直接计算即可。

P5179 Fraction

感觉很难想!

  • \(a=0\),此时原不等式变为 \(\frac p q<\frac c d\),变形得 \(q>\frac{pd}{c}\),取 \(p=1\) 得到最小的 \(q\)
  • \(\exist x\in (\frac{a}{b},\frac{c}{d})\),找一个最小的符合条件的 \(x\) 即可。
  • 一般情况,如果 \(a\ge b\),可以同时减去 \(\lfloor\frac{a}{b}\rfloor\),也就是变成 \(\frac{a\bmod b}{b}<\frac p q-\lfloor\frac{a}{b}\rfloor<\frac c d-\lfloor\frac{a}{b}\rfloor\),递归即可。
  • \(a< b\) 的时候,我们考虑取倒使其变为 \(\frac d c<\frac q p<\frac b a\),递归即可。

参考文献

本文在写作过程中,参考了洛谷日报与各例题题解,在此致谢。

posted @ 2022-07-11 20:33  时一月  阅读(89)  评论(0)    收藏  举报