题意:给一个长度为n的序列a,求最小的d使得gcd(a1+d,a2+d,a3+d…,an+d) ≥ \geq ≥ 2. (1 ≤ \leq ≤ n ≤ \leq ≤ 1e5,1 ≤ \leq ≤ a1 ≤ \leq ≤ 1e9)
题解:
考虑在原序列中如果出现两个相同的数那么对于d的影响等于一个数,所以我们可以考虑先去重排序,下文所描述的序列指去重排序之后的。
1. 若n=1:
考虑此时 a 1 a_1 a1的值,若 a 1 a_1 a1不为1则d为0,否则d为1.
1. 若n>1时:
设
g
c
d
(
a
1
+
d
,
a
2
+
d
,
.
.
.
.
.
.
,
a
n
+
d
)
=
m
gcd(a_1+d,a_2+d,......,a_n+d)=m
gcd(a1+d,a2+d,......,an+d)=m
那么
a
1
=
k
1
∗
m
−
d
;
a_1=k_1*m-d;
a1=k1∗m−d;
a
2
=
k
2
∗
m
−
d
;
a_2=k_2*m-d;
a2=k2∗m−d;
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..............
..............
a
n
=
k
n
∗
m
−
d
;
a_n=k_n*m-d;
an=kn∗m−d;
显然
a
2
−
a
1
=
(
k
2
−
k
1
)
∗
m
;
a_2-a_1=(k_2-k_1)*m;
a2−a1=(k2−k1)∗m;
a
3
−
a
1
=
(
k
3
−
k
1
)
∗
m
;
a_3-a_1=(k_3-k_1)*m;
a3−a1=(k3−k1)∗m;
.
.
.
.
.
.
.
.
.
.
.
.
.
.............
.............
a
n
−
a
1
=
(
k
n
−
k
1
)
∗
m
;
a_n-a_1=(k_n-k_1)*m;
an−a1=(kn−k1)∗m;
也就是说m是
a
2
a_2
a2-
a
1
a_1
a1,
a
3
a_3
a3-
a
1
a_1
a1,…
a
n
a_n
an-
a
1
a_1
a1的共因子,也就是他们最大公因数的因数。
但是不同的m对应的d不同,所以我们应该枚举所有的m取d的最小值。
时间复杂度O(n*
l
o
g
n
log_n
logn+sqrt(1e9))