CodeForces 1459C 数论 GCD
题意
-
首先给出n个数
-
之后给出m个数,每次问之前的n个数加上当前的这个数之后,总体的gcd是多少,也就是答案需要求出m个总体的gcd
思路
-
因为n和m都是2e5的范围,所以必须使用接近线性的算法
-
考虑每次的计算前都是对原数组进行加法运算的改动,所以可以去思考gcd计算中和加减法有关的知识。也就是更相减损术
-
公式:
g c d ( a , b , c ) = g c d ( a , b − a , c − b ) gcd(a, b, c) = gcd(a, b - a, c - b) gcd(a,b,c)=gcd(a,b−a,c−b)
对三个以上的序列也同样成立
- 所以先将第一列数进行从小到大的排序,然后计算出
C = g c d ( a 2 − a 1 , a 3 − a 2 , ⋅ ⋅ ⋅ , a