闲话
下一个目标就是 LP!
我觉得在闲话里写这种东西有奇效呢(
上次也是 上上次也是
抄书会被干吗?
我不知道啊 我反正只看从网上找到的资料
模拟赛 T2 O(n)?这种东西不算不闲的闲话吧
答案肯定是 [1, x - 1] * [x, y] 或 [x, y] * [y + 1, n] 的更大值
这启发我们固定 len,在后缀链接树上合并 endpos,记录 max/min
假设 min = max 这个点只有一个 endpos
反之 min < max,我们取 [min, min + len - 1] [max, max + len - 1] 都可以作为 [x, y]
判 max - min >= len 算答案
就没了
你可能会问
就是可能目前的 len 不是最优的
可能这部分长 那部分短
但是发现 len 是连续的
所以答案最优
类欧几里得算法
【模板】类欧几里得算法
Euclidean?
我们一个一个说。
1. f(a,b,c,n)
f(a,b,c,n)=n∑i=0⌊ai+bc⌋
我们分情况讨论。
首先预处理一下。当 a≥c 或 b≥c 时我们能将其对 c 取模:
f(a,b,c,n)= n∑i=0⌊ai+bc⌋= n∑i=0⎢⎢
⎢
⎢
⎢⎣(⌊ac⌋c+amodc)i+(⌊bc⌋c+bmodc)c⎥⎥
⎥
⎥
⎥⎦= n∑i=0⎢⎢
⎢
⎢
⎢⎣⌊ac⌋ci+⌊bc⌋c+(amodc)i+bmodcc⎥⎥
⎥
⎥
⎥⎦= n∑i=0⎢⎢
⎢
⎢
⎢⎣⌊ac⌋ci+⌊bc⌋cc⎥⎥
⎥
⎥
⎥⎦+n∑i=0⌊(amodc)i+bmodcc⌋= ⌊ac⌋n(n+1)2+⌊bc⌋(n+1)+n∑i=0⌊(amodc)i+bmodcc⌋= ⌊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⌋= n∑i=0⌊ai+bc⌋∑j=11= ⌊an+bc⌋∑j=1n∑i=0[j≤⌊ai+bc⌋]= ⌊an+bc⌋∑j=1n∑i=0[j≤ai+bc]= ⌊an+bc⌋∑j=1n∑i=0[jc−b−1<ai]= ⌊an+bc⌋∑j=1n∑i=0[⌊jc−b−1a⌋<i]= ⌊an+bc⌋∑j=1(n−⌊jc−b−1a⌋)= n⌊an+bc⌋−⌊an+bc⌋−1∑j=0⌊jc+c−b−1a⌋
记 m=⌊an+bc⌋,我们有
f(a,b,c,n)=nm−f(c,c−b−1,a,m−1)
这两个式子共同的地给出了类似于辗转相除法的做法,因此复杂度为 O(logn)。这也是该算法名称的来源。
2. g(a,b,c,n)
同理,有
g(a,b,c,n)= n∑i=0i⌊ai+bc⌋= n∑i=0i⎢⎢
⎢
⎢
⎢⎣(⌊ac⌋c+amodc)i+(⌊bc⌋c+bmodc)c⎥⎥
⎥
⎥
⎥⎦= n∑i=0i⎢⎢
⎢
⎢
⎢⎣⌊ac⌋ci+⌊bc⌋c+(amodc)i+bmodcc⎥⎥
⎥
⎥
⎥⎦= n∑i=0i⎢⎢
⎢
⎢
⎢⎣⌊ac⌋ci+⌊bc⌋cc⎥⎥
⎥
⎥
⎥⎦+n∑i=0i⌊(amodc)i+bmodcc⌋= ⌊ac⌋n(n+1)(2n+1)2+⌊bc⌋n(n+1)2+n∑i=0i⌊(amodc)i+bmodcc⌋= ⌊ac⌋n(n+1)(2n+1)2+⌊bc⌋n(n+1)2+g(amodc,bmodc,c,n)
记 m=⌊an+bc⌋。同理,有
g(a,b,c,n)= n∑i=0i⌊ai+bc⌋= n∑i=0⌊ai+bc⌋∑j=1i= m∑j=1n∑i=0i[j≤⌊ai+bc⌋]= m∑j=1n∑i=0i[j≤ai+bc]= m∑j=1n∑i=0i[jc−b−1<ai]= m−1∑j=0n∑i=0i[⌊jc+c−b−1a⌋<i]
记 t=⌊jc+c−b−1a⌋,有
m−1∑j=0n∑i=0i[t<i]= m−1∑j=0(n−t)(n+t+1)2= 12(m(n2+n)−m−1∑j=0(t2+t))= 12(m(n2+n)−h(c,c−b−1,a,m−1)−f(c,c−b−1,a,m−1))
3. h(a,b,c,n)
同理,有
h(a,b,c,n)= n∑i=0⌊ai+bc⌋2= n∑i=0⎢⎢
⎢
⎢
⎢⎣(⌊ac⌋c+amodc)i+(⌊bc⌋c+bmodc)c⎥⎥
⎥
⎥
⎥⎦2= n∑i=0⎢⎢
⎢
⎢
⎢⎣⌊ac⌋ci+⌊bc⌋c+(amodc)i+bmodcc⎥⎥
⎥
⎥
⎥⎦2= n∑i=0⎢⎢
⎢
⎢
⎢⎣⌊ac⌋ci+⌊bc⌋cc⎥⎥
⎥
⎥
⎥⎦2+n∑i=0⌊(amodc)i+bmodcc⌋2+2n∑i=0⎢⎢
⎢
⎢
⎢⎣⌊ac⌋ci+⌊bc⌋cc⎥⎥
⎥
⎥
⎥⎦×⌊(amodc)i+bmodcc⌋2= n∑i=0(⌊ac⌋i+⌊bc⌋)2+n∑i=0⌊(amodc)i+bmodcc⌋2+2n∑i=0(⌊ac⌋i+⌊bc⌋)×⌊(amodc)i+bmodcc⌋= n∑i=0(⌊ac⌋2i2+⌊bc⌋2+2⌊ac⌋⌊bc⌋i)+h(amodc,bmodc,c,n)+2⌊ac⌋n∑i=0i⌊(amodc)i+bmodcc⌋+2⌊bc⌋n∑i=0⌊(amodc)i+bmodcc⌋= ⌊ac⌋2n(n+1)(2n+1)2+⌊bc⌋2(n+1)+⌊ac⌋⌊bc⌋n(n+1)+h(amodc,bmodc,c,n)+2⌊ac⌋g(amodn,bmodn,c,n)+2⌊bc⌋f(amodn,bmodn,c,n)
记 m=⌊an+bc⌋,t=⌊jc+c−b−1a⌋。
我们不想出现两个求和号相乘,因此拆开 n2 为 2n(n+1)/2−n。
f(a,b,c,n)= n∑i=0⌊ai+bc⌋2= n∑i=0⎛⎜
⎜⎝2⌊ai+bc⌋∑j=1j−⌊ai+bc⌋⎞⎟
⎟⎠= 2n∑i=0⌊ai+bc⌋∑j=1j−f(a,b,c,n)
n∑i=0⌊ai+bc⌋∑j=1j= m−1∑j=0(j+1)n∑i=0[j<⌊ai+bc⌋]= m−1∑j=0(j+1)n∑i=0[i>t]= m−1∑j=0(j+1)(n−t)= nm(m+1)2−m−1∑j=0(j+1)t= nm(m+1)2−m−1∑j=0jt−m−1∑j=0t= nm(m+1)2−g(c,c−b−1,a,m−1)−f(c,c−b−1,a,m−1)
则
h(a,b,c,n)=nm(m+1)−2g(c,c−b−1,a,m−1)−2f(c,c−b−1,a,m−1)−f(a,b,c,n)
我们可以将三个函数合并递归,这样减小了常数。
根据辗转相除法,总时间复杂度为 O(logn)。
合并写法
int T, n, a, b, c;
struct dat {
mint f, g, h;
};
dat f(int n, int a, int b, int c) {
mint ac = a / c, bc = b / c, m = (1ll * a * n + b) / c, n1 = n + 1, n21 = 2 * n + 1;
dat ret;
if (a == 0) {
ret.f = bc * n1, ret.g = bc * n * n1 * inv2, ret.h = bc * bc * n1;
return ret;
}
if (a >= c or b >= c) {
ret.f = n * n1 * inv2 * ac + bc * n1;
ret.g = ac * n * n1 * n21 * inv6 + bc * n * n1 * inv2;
ret.h = ac * ac * n * n1 * n21 * inv6 +
bc * bc * n1 + ac * bc * n * n1;
auto v = f(n, a % c, b % c, c);
ret.h += v.h + 2 * bc * v.f + 2 * ac * v.g;
ret.g += v.g;
ret.f += v.f;
return ret;
}
auto v = f((1ll * a * n + b) / c - 1, c, c - b - 1, a);
ret.f = n * m - v.f;
ret.g = inv2 * (n * m * n1 - v.h - v.f);
ret.h = n * m * (m + 1) - 2 * v.g - 2 * v.f - ret.f;
return ret;
}
signed main() {
iot;
cin >> T;
while ( T -- ) {
cin >> n >> a >> b >> c;
auto v = f(n, a, b, c);
cout << v.f << ' ' << v.h << ' ' << v.g << '\n';
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!