[ABC254F] Rectangle GCD Solution

更好的阅读体验戳此进入

题面

给定序列 an,bn,存在 n×n 的网格图,令图上 (i,j) 位置的值为 ai+bjq 次询问给定 h1,h2,w1,w2,查询左上角为 (h1,w1),右下角为 (h2,w2) 的矩形中所有数的 gcd

Solution

挺好的一道水题,有一道类似的题,AcWing 246 区间最大公约数,简而言之就是实现区间加,区间求 gcd。这道题也是类似的。

首先有一个性质,更相减损术,即 gcd(a,b)=gcd(a,ba)。然后我们尝试列举一个以 (i,j) 为左上角,(x,y) 为右下角的矩形:

ai+bjai+bj+1ai+bj+2ai+by
ai+1+bjai+1+bj+1ai+1+bj+2ai+1+by
ai+2+bjai+2+bj+1ai+2+bj+2ai+2+by
ax+bjax+bj+1ax+bj+2ax+by

然后不难发现可以通过更相减损术,对这个矩形横向进行差分:

ai+bjbj+1bjbj+2bj+1byby1
ai+1+bjbj+1bjbj+2bj+1byby1
ai+2+bjbj+1bjbj+2bj+1byby1
ax+bjbj+1bjbj+2bj+1byby1

发现除了最初始的位置,剩下的每一列都是相同的,所以我们不难想到,除了第一行第一列之外的数,会因为重复所以可以不用考虑。同时对于对应的第一列,也可以差分。最后就可以变成,对于一段查询,求的是序列 a 差分数组的 [w1+1,w2]gcd,和序列 b 差分数组的 [h1+1,h2]gcd,再和 ah1+bw1 做一下 gcd 即可,记得判断 w1w2h1h2

然后考虑如何快速维护区间的 gcd,这个东西也就可以直接挂在线段树上,或者因为没有修改,用 ST表 也行(不过我不喜欢 ST表,所以用的线段树维护)。

Code

UPD

update-2022_12_06 初稿