246. 区间最大公约数
246. 区间最大公约数 - AcWing题库
给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:
C l r d
,表示把 A[l],A[l+1],… 都加上 d。
Q l r
,表示询问 A[l],A[l+1],… 的最大公约数(GCD)。
对于每个询问,输出一个整数表示答案。
输入格式
第一行两个整数 N,M。
第二行 N 个整数 A[i]。
接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
数据范围
N≤500000,M≤100000,
1≤A[i]≤10^18,
|d|≤10^18,
保证数据在计算过程中不会超过 long long 范围。
输入样例:
5 5
1 3 5 7 9
Q 1 5
C 1 5 1
Q 1 5
C 3 3 6
Q 2 4
输出样例:
1
2
4
解析:
根据lyd的《算法进阶指南》:
通过辗转相减法可知:gcd(x,y)=gcd(x,y-x)。可以进一步拓展为三个数gcd(a,b,c)=gcd(a,b-a,c-b);
以此类推:询问“Q,l, r,就相当于求gcd(A[l],ask(1,l+1,r));
注意特殊情况:
if (l < r) {
printf("%lld\n", gcd(t, ask(1, l + 1, r)));
}
else {
printf("%lld\n", t);
}
否则ask(1,l+1,r),当l+1>r时会出错;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include