稻的《中继输出者》杀翻一切成为周榜 rk1,挺强的 . 不过这首绝对是给歌爱雪写的吧!
大豆那个题被爆标了,具体细节暂且不讨论 .
早就想写了,类欧几里得算法:
问题:
\[\newcommand{\floorf}[2]{\left\lfloor\frac{#1}{#2}\right\rfloor}\begin{aligned}&f(a,b,c,n)=\sum_{i=0}^n\floorf{ai+b}c\\&g(a,b,c,n)=\sum_{i=0}^ni\floorf{ai+b}c\\&h(a,b,c,n)=\sum_{i=0}^n\floorf{ai+b}c^2\end{aligned}\]
(洛谷模板)
分别考虑:
求 \(\bm{f(a,b,c,n)}\)
首先当 \(a\ge c\) 或 \(b\ge c\) 时可以将其归约至小于 \(c\) 的情况:
\[\begin{aligned}f(a,b,c,n)&=\sum_{i=0}^n \floorf{{(\floorf acc+a\bmod c)i+(\floorf bc c+b\bmod c)}}{c}\\&=\floorf ac\dfrac{n(n+1)}{2}+\floorf bc(n+1)+\sum_{i=0}^n \floorf{(a\bmod c)i+(b\bmod c)}{c}\\&=\floorf ac\dfrac{n(n+1)}{2}+\floorf bc(n+1)+f(a\bmod c,b\bmod c,c,n)\end{aligned}
\]
那么假设 \(a,b<c\),则:
\[\begin{aligned}f(a,b,c,n)&=\sum_{i=0}^n\sum_{j=1}^{\floorf{ai+b}c}1\\&=\sum_{j=1}^{\floorf{an+b}c}\sum_{i=0}^n\left[j\le\floorf{ai+b}c\right]\\&=\sum_{j=1}^{\floorf{an+b}c}\sum_{i=0}^n\left[\floorf{jc-b-1}a<i\right]\\&=\sum_{j=1}^{\floorf{an+b}c}\left(n-\floorf{jc-b-1}a\right)\\&=n\floorf{an+b}c-f\left(c,c-b-1,a,\floorf{an+b}c-1\right)\end{aligned}
\]
那么递归算就完了,因为是辗转相除的形式所以时间复杂度是 \(O(\log n)\) 的 .
那剩下两个都差不多了,后面 dirty-works 不展开写了:
求 \(\bm{g(a,b,c,n)}\)
为了方便,先让 \(\displaystyle m=\floorf{an+b}c,\,t=\floorf{jc-b-1}{a},\,k=\floorf{jc+c-b-1}a\) .
那么:
\[g(a,b,c,n)=\floorf ac\dfrac{n(n+1)(2n+1)}6+\floorf bc\dfrac{n(n+1)}2+g(a\bmod c,b\bmod c,c,n)
\]
\[\begin{aligned}g(a,b,c,n)&=\sum_{i=0}^ni\sum_{j=1}^{\floorf{ai+b}c}1\\&=\sum_{j=1}^m\sum_{i=0}^ni\cdot[i>t]\\&=\sum_{j=0}^{m-1}\dfrac{(k+1+n)(n-k)}2\\&=\dfrac12(m(n^2+n)-h(c,c-b-1,a,m-1)-f(c,c-b-1,a,m-1))\end{aligned}
\]
求 \(\bm{h(a,b,c,n)}\)
\[\begin{aligned}h(a,b,c,n)&=\floorf ac^2\dfrac{n(n+1)(2n+1)}6+\floorf bc^2(n+1)+h(a\bmod c,b\bmod c,c,n)\\&+2\floorf acg(a\bmod c,b\bmod c,c,n)+2\floorf bcf(a)\bmod c,b\bmod c,c,n)+\floorf ac\floorf bc(n+1)\end{aligned}
\]
考虑用 \(n^2=2(\sum_{i=0}^ni)-n\) 拆平方:
\[\begin{aligned}h(a,b,c,n)&=\sum_{i=0}^n2\left(\sum_{j=0}^mj-\floorf{ai+b}c\right)\\&=-f(a,b,c,n)+2\sum_{i=0}^n\sum_{j=0}^{\floorf{ai+b}c-1}(j+1)\\h(a,b,c,n)+f(a,b,c,n)&=2\sum_{j=0}^{m-1}(j+1)\sum_{i=0}^n[i>k]\\&=2\sum_{j=0}^m(j+1)(n-k)\\&=2\left(\dfrac{m(m+1)n}2-f(c,c-b-1,a,m-1)-g(c,c-b-1,a,m-1)\right)\\&=m(m+1)n-2\cdot f(c,c-b-1,a,m-1)-2\cdot g(c,c-b-1,a,m-1)\end{aligned}
\]
这里 \(g,h\) 互相依赖,需要一起递推 .
那么就推完了,挺好 .
一般还是用求 \(f\) 的比较多:
ll f(ll a, ll b, ll c, ll n)
{
if (!a) return b/c * (n+1);
if ((a>=c) || (b>=c)) return a/c * n * (n+1) / 2 + b/c * (n+1) + f(a%c, b%c, c, n);
return n * ((a*n+b)/c) - f(c, c-b-1, a, (a*n+b)/c-1);
}
整几个例题看看:
Earthquake
给定非负整数 \(a,b,c\),求 \(ax+by\le c\) 的非负整数解个数 .
就是直线下整点个数,比较经典的类欧问题:
\[\begin{aligned}\mathrm{ans}&=\sum_{x=0}^{\floorf ac}\left(\floorf{c-ax}b+1\right)\\&=\sum_{x=0}^{\floorf ac}\left(\floorf{(b-a)x+c}b-x+1\right)\\&=\floorf ac-\frac{\floorf ac(\floorf ac+1)}2+\sum_{x=0}^{\floorf ac}\floorf{(b-a)x+c}b\end{aligned}
\]
画个图可能比较直观 . 到这里已经可以求了 .
Simple Math 3
给定非负整数 \(a,b,c,d\),求有多少个正整数 \(i\) 满足闭区间 \([a+bi,a+ci]\) 中没有 \(d\) 的倍数 .
如果一个区间 \([a+bi,c+di]\) 不存在解至少要长度不大于 \(d\),那么首先有 \(i<\floorf{d-1}{c-b}\) .
剩下的情况每个区间至多包含一个解,那么考虑容斥,求出所有区间解的个数然后减就行了 .
关于区间解的个数,只需要求前缀和即可:
\[R=\sum_{i=0}^{\floorf{d-1}{c-b}}\left(\floorf{a+ci}d-\floorf{a-1+bi}d\right)
\]
把求和号拆开就可以类欧了 .
Popcount Sum
给定非负整数 \(n,m,r\),求小于等于 \(n\) 且模 \(m\) 为 \(r\) 的正整数的 popcount 之和 .
可能这个题才是类欧入门题吧!
后令 \(k=\log n\),考虑 popcount 的一种表示形式:
\[\operatorname{popcount}(n)=n-\sum_{i=1}^k\floorf n{2^i}
\]
令 \(b=\floorf{n-r}m\),那么:
\[\begin{aligned}\mathrm{ans}&=\sum_{t=0}^b\operatorname{popcount}(mt+r)\\&=\sum_{t=0}^b\left(mt+r-\sum_{i=1}^k\floorf{mt+r}{2^i}\right)\\&=\dfrac{mb(b+1)}2+(b+1)r-\sum_{t=0}^b\sum_{i=1}^k\floorf{mt+r}{2^i}\\&=\dfrac{mb(b+1)}2+(b+1)r-\sum_{i=1}^k\sum_{t=0}^b\floorf{mt+r}{2^i}\end{aligned}
\]
那么做 \(k\) 次类欧就行了,时间复杂度是 \(O(T\log^2n)\) .
这个是 joke3579 做法,感觉还挺漂亮的 .