G. Greatest Common Divisor codeforces gym 102823 G

原题地址

题意:给一个长度为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=k1md;
a 2 = k 2 ∗ m − d ; a_2=k_2*m-d; a2=k2md;
. . . . . . . . . . . . . . .............. ..............
a n = k n ∗ m − d ; a_n=k_n*m-d; an=knmd;
显然
a 2 − a 1 = ( k 2 − k 1 ) ∗ m ; a_2-a_1=(k_2-k_1)*m; a2a1=(k2k1)m;
a 3 − a 1 = ( k 3 − k 1 ) ∗ m ; a_3-a_1=(k_3-k_1)*m; a3a1=(k3k1)m;
. . . . . . . . . . . . . ............. .............
a n − a 1 = ( k n − k 1 ) ∗ m ; a_n-a_1=(k_n-k_1)*m; ana1=(knk1)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))

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值