309 -p0104-1819 序列中不同最大公约数的数目

思路

x从1到最大循环,如果m是x的倍数,n也是x的倍数,并且m,n的最大公因数是x,则【m,n】符合条件。 如果m,n的最大公因数是k,那么k一定是x的倍数。 因为 kk1=m,kk2=n,xx1=m,kk1=xx1; x=kk1/x1,因为x是整数,所以k1/x1是证整数。

代码

原始代码

 public int countDifferentSubsequenceGCDs02(int[] nums) {
        int maxVal = Arrays.stream(nums).max().getAsInt();
        boolean[] isContain=new boolean[maxVal+1];// 判断 某个元素是否在nums中出现
        for (int num : nums) {
            isContain[num]=true;
        }
        int res=0;
        for (int i = 1; i <=maxVal; i++) {
            int tempMaxGYS=0; // 暂时最大公因数 0与任何数的最大公因数是这个数
            for (int j = i; j <=maxVal; j+=i) { //j是i的倍数
                if (isContain[j]){
                    tempMaxGYS=gcd(tempMaxGYS,j);
                }
                if (i==tempMaxGYS){// 找到一个
                    res++;
                    break;
                }
            }
        }

        return res;

    }


    public int gcd(int num1, int num2) {
        while (num2 != 0) {
            int temp = num1;
            num1 = num2;
            num2 = temp % num2;
        }
        return num1;
    }

在这里插入图片描述
子序列长度为1, j只需要到i,如果子序列长度至少为2,i不在num中,此时j至少到2i,3i.

优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弈师亦友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值