I18-leetcode1819序列中不同最大公约数的数目

题目描述:

算法:枚举

代码:

def countDifferentSubsequenceGCDs(nums):
    def gcd(a,b):
        if b==0:return a
        return gcd(b,a%b)

    #枚举所有可能的最大公约数,并且去nums当中去查找验证能否出现对应的序列
    #1.显然所有子序列所能提供的最大公约数的值一定是落在[1,max(nums)]中
    maxVal=max(nums)

    ans=0
    #逐一枚举所有可能的最大公约数,并加以验证
    for i in range(1,maxVal+1):
        #最大公约数是i的时候,最小的元素只能是自己或者更大一些
        subGcd=0#子序列的最大公约数
        j=i
        while j<=maxVal:
            if j in nums:#一个元素压根都不存在,那也就是不用检查当前的元素了
                if subGcd==0:
                    subGcd=j
                else:
                    subGcd=gcd(subGcd,j)
                if subGcd==i:
                    ans+=1
                    break#能找到一个可以提供最大公约数为i的子序列即可
            j+=i
    return ans

nums=[6,10,3]
print(countDifferentSubsequenceGCDs(nums))

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值