考虑以下问题:求 \(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,就不展开了。
习题
\(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) 即可,用类欧做一做就行了。
首先先差分转成 \([0,n]\) 内的问题。
考虑 \(\gcd(a,b)=1\) 的情况,不满足这种情况的可以同时除以 \(\gcd(a,b)\),注意到 \(n>(a-1)(b-1)\) 没意义(小凯的疑惑),而 \(\le (a-1)(b-1)\) 的部分最多一组非负整数解,套用上题做法即可。
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}
\]
直接计算即可。
感觉很难想!
- \(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\),递归即可。
参考文献
本文在写作过程中,参考了洛谷日报与各例题题解,在此致谢。