考虑最值分治,当然也可以用笛卡尔树,这两个东西本质一样。
假设当前分治的区间为
x∼y,令
x∼y 最大的
ai 为
ak。枚举小的一边(这里只讨论枚举左边,右边的同理),这时固定了
bl,ak,变为求
m 次:
k∼r 中
bl≡bi(modak) 的
i 的个数。存成
m 个询问,形如
l,r,x,y,求
l∼r 中模
x 为
y 的
bi 的个数。
根号分治跑询问即可,时间复杂度
O(nnlogn)。
思考为什么最值分治枚举小的一边时间复杂度是
O(nlogn)。因为其对左区间长度与右区间长度取了最小值,这题也可以考虑这么优化。
假设当前分治区间短的一边的长度为
q,对短边跑根号分治的时间复杂度为
O(qV)。若
qV>n,显然不如暴力枚举另一边,那么就有:
T(n)=2k≤nmax{T(k−1)+T(n−k)+min{kV,n}},可得
T(n)=O(nV)。
时隔多日后补个证明,别打我。
令
u=Vn(这是函数内的
n)。
把
T(n) 拆成(以下所有内容,默认
2k≤n):
T(n)=max{k≤umax{T(n−k)+kV+2k(k−1)},k≥umax{T(k−1)+T(n−k)+n}}
考虑从其中弄出两个函数:
A(n)=k≤umax{A(n−k)+2k(k−1)+kV}
B(n)=k≥umax{B(n−k)+B(k−1)+n}
对于
A(n) 绝对是
k 越大越好,于是
k=u,易证
A(n)=O(nV)。
易证
A(n)=B(n)。
考虑从
1→n 计算
T(n),对于
n≤V 有:
T(n)=A(n)=B(n)。
考虑代入法:
T(n)=max{k≤umax{A(n−k)+kV+2k(k−1)},k≥umax{B(k−1)+B(n−k)+n}}=max{A(n),B(n)}=O(nV)
终于结束啦。