题目描述
有N个整数,kAc会对它们做Q次修改。
每次修改指的是对所有数加一个整数(可正可负)
每修改一次后,他想知道当前所有数的最大公约数是多少。
对于40%:N, Q <= 1000
对于70%:N, Q <= 40000
对于100%:N, Q <= 100000,所有数的绝对值始终小于等于10^16
在这里,我们认为任意非负整数x跟0的最大公约数都是x,另外,负数的最大公约数等于其绝对值的最大公约数。
输入格式
第一行两个整数N, Q
接下来N行,每行一个整数,表示这N个数的初始值。
接下来Q行,每行一个整数,表示这Q个操作。第i个数表示这一次操作是增加了多少。
输出格式
共Q行,表示进行完第i次操作后,所有数的最大公约数
样例输入
样例输出
注释
对于40%:N, Q <= 1000
对于70%:N, Q <= 40000
对于100%:N, Q <= 100000,所有数的绝对值始终小于等于10^16
在这里,我们认为任意非负整数x跟0的最大公约数都是x,另外,负数的最大公约数等于其绝对值的最大公约数。
var i,n,m:longint; a1,min,tmp:int64; function gcd(a,b:int64):int64; begin if b=0 then exit(a) else exit(gcd(b,a mod b)); end; begin read(n,m); read(a1); min:=0; for i:=2 to n do begin read(tmp); min:=gcd(min,abs(tmp-a1)); a1:=tmp; end; for i:=1 to m do begin read(tmp); inc(a1,tmp); writeln(abs(gcd(min,a1))); end; end.
{思路,注意到,不管把这些数加上什么,他们的差值都不会变,有因为gcd(a,b)=gcd(a-b,b),所以只要预处理算出所有差值的gcd,记做min,以后每做一次处理tmp,再输出gcd(min,a1+tmp)(a1为任意的一个数)就可以了}{参考 兰多夫 的博客}