给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:
1、“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d。
2、“Q l r”,表示询问 A[l],A[l+1],…,A[r] 的最大公约数(GCD)。
对于每个询问,输出一个整数表示答案。
输入格式
第一行两个整数N,M。
第二行N个整数A[i]。
接下来M行表示M条指令,每条指令的格式如题目描述所示。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
数据范围
N≤500000,M≤100000
输入样例:
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
思路:因为根据更相减损术求最大公约数的方法:其实就是欧几里得算法的一个特例:即:gcd(a-n*b,b)=gcd(a,b)
如:gcd(a,b,c)=gcd(gcd(a,b),gcd(b,c))=gcd(gcd(a,b-a),gcd(b,c-b))=gcd(gcd(a,gcd(b-a,b))),c-b)
因为gcd(b-a,b)=b-a, 所以原式=gcd(a,b-a,c-b) 即:结论:gcd(a,b,c)=gcd(a,b-a,c-b) 当然,可以推广到n个数
结论中等号后面的gcd的括号里显然就是原序列的差分序列,所以我们就可以分成两部分求解,先用