蓝桥杯练习题 近似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,相两个整数之间用一个空格分隔

代码

import math
n,g=map(int,input().split())
a=[0]+list(map(int,input().split()))

re=0
left=1
right=1
temp=0#记录的上一个不是g的数的位置
for right in range(1,n+1):
    t=math.gcd(g,a[right])
    if t != g:#如果当前这个数不是g的倍数
        left=temp+1
        temp=right
    if right-left+1>=2:re+=right-left
print(re)

代码分析

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值