246. 区间最大公约数

原题链接

区间修改操作之后,最大公约数无法维护,但是单点修改之后,最大公约数是可以维护的。

这里有一个蛮重要的结论。

注:\((S)\)表示集合S的最大公约数。

\((a_1,a_2,...a_n)=(a_1,a_2-a_1,a_3-a_2,...,a_n-a_{n-1})\)

证明:

\(d\)\({a_1,a_2,...,a_n}\)的一个公约数(注意,不是最大)。

所以\(d|a_1,d|a_2,...d|a_n\)

\(a_1=k_1d\)\(a_2=k_2d\)

\(a_1-a_2=k_1d-k_2d=d(k_1-k_2)\)

所以\(d|(a_1-a_2)\)

同理可得,\(d\)也是\({a_1,a_2-a_1,...,a_n-a_{n-1}}\)的一个公约数。

不妨令\(d=(a_1,a_2,...a_n)\),而最大公约数大于等于任何一个公约数。

所以\((a_1,a_2,...a_n) \le (a_1,a_2-a_1,...,a_n-a_{n-1})\)

类似地,令\(d=(a_1,a_2-a_1,...,a_n-a_{n-1})\)

所以\(d|a_1, d|{a_2-a_1},...,d|{a_n-a_{n-1}}\)

\(a_1=k_1d, a_2-a_1=k_2d\)

\(a_2=(a_2-a_1)+a_1=k_2d+k_1d=(k_1+k_2)d\),所以\(d|a_2\)

同理,\(d\)\({a_1,a_2,...,a_n}\)的一个公约数。

又因为最大公约数大于任何一个公约数,所以:

\((a_1,a_2,...,a_n) \ge (a_1,a_2-a_1,...,a_n-a_{n-1})\)

综上,\((a_1,a_2,...,a_n) = (a_1,a_2-a_1,...,a_n-a_{n-1})\)


回到原题,我们可以维护一个差分数列,这样\([L,R]\)的最大公约数就是\((a_L, query([L+1,R]))\),而且只有单点修改,容易维护最大公约数,由于要用到原值,在维护一个区间和sum即可。

CODE

posted @ 2022-10-31 10:17  Zlc晨鑫  阅读(62)  评论(0)    收藏  举报