稻的《中继输出者》杀翻一切成为周榜 rk1,挺强的 . 不过这首绝对是给歌爱雪写的吧!
大豆那个题被爆标了,具体细节暂且不讨论 .
早就想写了,类欧几里得算法:
问题:
f(a,b,c,n)=n∑i=0⌊ai+bc⌋g(a,b,c,n)=n∑i=0i⌊ai+bc⌋h(a,b,c,n)=n∑i=0⌊ai+bc⌋2
(洛谷模板)
分别考虑:
求 f(a,b,c,n)
首先当 a≥c 或 b≥c 时可以将其归约至小于 c 的情况:
f(a,b,c,n)=n∑i=0⎢⎢
⎢
⎢
⎢⎣(⌊ac⌋c+amodc)i+(⌊bc⌋c+bmodc)c⎥⎥
⎥
⎥
⎥⎦=⌊ac⌋n(n+1)2+⌊bc⌋(n+1)+n∑i=0⌊(amodc)i+(bmodc)c⌋=⌊ac⌋n(n+1)2+⌊bc⌋(n+1)+f(amodc,bmodc,c,n)
那么假设 a,b<c,则:
f(a,b,c,n)=n∑i=0⌊ai+bc⌋∑j=11=⌊an+bc⌋∑j=1n∑i=0[j≤⌊ai+bc⌋]=⌊an+bc⌋∑j=1n∑i=0[⌊jc−b−1a⌋<i]=⌊an+bc⌋∑j=1(n−⌊jc−b−1a⌋)=n⌊an+bc⌋−f(c,c−b−1,a,⌊an+bc⌋−1)
那么递归算就完了,因为是辗转相除的形式所以时间复杂度是 O(logn) 的 .
那剩下两个都差不多了,后面 dirty-works 不展开写了:
求 g(a,b,c,n)
为了方便,先让 m=⌊an+bc⌋,t=⌊jc−b−1a⌋,k=⌊jc+c−b−1a⌋ .
那么:
g(a,b,c,n)=⌊ac⌋n(n+1)(2n+1)6+⌊bc⌋n(n+1)2+g(amodc,bmodc,c,n)
g(a,b,c,n)=n∑i=0i⌊ai+bc⌋∑j=11=m∑j=1n∑i=0i⋅[i>t]=m−1∑j=0(k+1+n)(n−k)2=12(m(n2+n)−h(c,c−b−1,a,m−1)−f(c,c−b−1,a,m−1))
求 h(a,b,c,n)
h(a,b,c,n)=⌊ac⌋2n(n+1)(2n+1)6+⌊bc⌋2(n+1)+h(amodc,bmodc,c,n)+2⌊ac⌋g(amodc,bmodc,c,n)+2⌊bc⌋f(a)modc,bmodc,c,n)+⌊ac⌋⌊bc⌋(n+1)
考虑用 n2=2(∑ni=0i)−n 拆平方:
h(a,b,c,n)=n∑i=02(m∑j=0j−⌊ai+bc⌋)=−f(a,b,c,n)+2n∑i=0⌊ai+bc⌋−1∑j=0(j+1)h(a,b,c,n)+f(a,b,c,n)=2m−1∑j=0(j+1)n∑i=0[i>k]=2m∑j=0(j+1)(n−k)=2(m(m+1)n2−f(c,c−b−1,a,m−1)−g(c,c−b−1,a,m−1))=m(m+1)n−2⋅f(c,c−b−1,a,m−1)−2⋅g(c,c−b−1,a,m−1)
这里 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≤c 的非负整数解个数 .
就是直线下整点个数,比较经典的类欧问题:
ans=⌊ac⌋∑x=0(⌊c−axb⌋+1)=⌊ac⌋∑x=0(⌊(b−a)x+cb⌋−x+1)=⌊ac⌋−⌊ac⌋(⌊ac⌋+1)2+⌊ac⌋∑x=0⌊(b−a)x+cb⌋
画个图可能比较直观 . 到这里已经可以求了 .
Simple Math 3
给定非负整数 a,b,c,d,求有多少个正整数 i 满足闭区间 [a+bi,a+ci] 中没有 d 的倍数 .
如果一个区间 [a+bi,c+di] 不存在解至少要长度不大于 d,那么首先有 i<⌊d−1c−b⌋ .
剩下的情况每个区间至多包含一个解,那么考虑容斥,求出所有区间解的个数然后减就行了 .
关于区间解的个数,只需要求前缀和即可:
R=⌊d−1c−b⌋∑i=0(⌊a+cid⌋−⌊a−1+bid⌋)
把求和号拆开就可以类欧了 .
Popcount Sum
给定非负整数 n,m,r,求小于等于 n 且模 m 为 r 的正整数的 popcount 之和 .
可能这个题才是类欧入门题吧!

后令 k=logn,考虑 popcount 的一种表示形式:
popcount(n)=n−k∑i=1⌊n2i⌋
令 b=⌊n−rm⌋,那么:
ans=b∑t=0popcount(mt+r)=b∑t=0(mt+r−k∑i=1⌊mt+r2i⌋)=mb(b+1)2+(b+1)r−b∑t=0k∑i=1⌊mt+r2i⌋=mb(b+1)2+(b+1)r−k∑i=1b∑t=0⌊mt+r2i⌋
那么做 k 次类欧就行了,时间复杂度是 O(Tlog2n) .
这个是 joke3579 做法,感觉还挺漂亮的 .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】