当前位置:   article > 正文

蓝桥杯练习题 近似GCD 双指针

近似gcd

题目

小蓝有一个长度为 n 的数组 4 =(a1, a2,··,an),数组的了数组被定义为从 原数组中选出连续的一个或多个元素组成的数组。数组的最大公约数指的是数 组中所有元素的最大公约数。
如果最多更改数组中的一个元素之后,数组的最大公约数为 g,那么称 g 为这个数组的近似GCD
一个数组的近似 GCD 可能有多种取值。
具体的,判断 g 是否为一个数组的近似 GCD 如下
1.如果这个子数组的最大公约数就是 g,那么说明 g 是其近似GCD.
2.在修改这个子数组中的一个元素之后(可以改成想要的任何值),数组的最大公约数为 g,那么说明 g 是这个了数组的近似 GCD。
小蓝想知道数组 A有多少个长度大于等于 2的子数组满足近似GCD的值为 g。

输入格式

输入的第一行包含两个整数 n,g,用一个空格分隔,分别表示数组 A的长度和 g 的值 第二行包含 n 个整数 a1,a2,··,an,相两个整数之间用一个空格分隔

代码

  1. import math
  2. n,g=map(int,input().split())
  3. a=[0]+list(map(int,input().split()))
  4. re=0
  5. left=1
  6. right=1
  7. temp=0#记录的上一个不是g的数的位置
  8. for right in range(1,n+1):
  9. t=math.gcd(g,a[right])
  10. if t != g:#如果当前这个数不是g的倍数
  11. left=temp+1
  12. temp=right
  13. if right-left+1>=2:re+=right-left
  14. print(re)

代码分析

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/592687
推荐阅读
相关标签
  

闽ICP备14008679号