首页 > 其他分享 >LC 2447. Number of Subarrays With GCD Equal to K

LC 2447. Number of Subarrays With GCD Equal to K

时间:2023-02-16 01:55:05浏览次数:55  
标签:frac gcd nums int Subarrays GCD text return 2447

2447. Number of Subarrays With GCD Equal to K


思路与题解

最大公约数,Euclidean algorithms算法证明:

如果我们有2个数: \(a\) 和 \(b\),不妨假设 \(a > b\),当不能整除的情况下,设 \(a = b \times k + c\),其中 \(c < b\)。

通过证明可以得到:\(\text{gcd}(a, b) = \text{gcd}(b, a \; \text{mod} \; b)\)。

证明Step 1:\(a\) 与 \(b\) 的公约数也是 \(a \; \text{mod} \; b\) 的公约数。可以设 \(d | a\) 与 \(d | b\)(\(a=m \times d\),\(d\) 为整数)。显然 \(c = a - b \times k\),可得:\(\frac{c}{d} = \frac{a}{d} - \frac{b}{d} \times k\),\(\frac{a}{d}\) 是整数,\(\frac{b}{d} \times k\) 也是整数,因此 \(\frac{c}{d}\) 也是整数。因此 \(d|c\) 得证,即是 \((c = a \; \text{mod} \; b) | d\) ,正向成立。

证明Step 2:\(b\) 与 \(a \; \text{mod} \; b\) 的公约数也是 \(a\) 的公约数。可以设 \(d | b\) 与 \(d | c\)。可得:\(\frac{a}{d} = \frac{c}{d} - \frac{b}{d} \times k\),其中等式右边同样都是整数,因此 \(\frac{a}{d}\) 也是整数,因此得证。

由于 \(\text{gcd}(a, b) = \text{gcd}(b, a \; \text{mod} \; b)\),自然最大公约数也是相同的。

使用Euclidean algorithms算法计算最大公约数:

public int gcd(int a , int b){
    if(b == 0) return a;
    return gcd(b , a % b);
}

解法1:暴力法,枚举每一个subarray,计算最大公约数,TLE。

def subarrayGCD(self, nums, k):
    if len(nums) == 1:
        if nums[0] != k:
            return 0
        else:
            return 1

    count = 0
    for i in range(len(nums)):
        for j in range(i, len(nums)+1):
            gcd = math.gcd(*nums[i:j])

            if gcd == k:
                count += 1

    return count

解法2:暴力扫描法。时间复杂度 \(O(n^2)\)。基本思路:维护 nums[i]nums[j] 的gcd,看是不是后面的 j 对应元素的 gcd,如果不是,只会更小就早停;如果是,那是不是和 k 相等,相等就+1。双指针法应该也可以。

public int subarrayGCD(int[] nums, int k) {
    if (nums.length == 1) {
        if (nums[0] == k) return 1;
        else return 0;
    }

    // 暴力扫描法,计算subarray gcd
    int count = 0;
    for (int i = 0; i < nums.length; i++) {
        int currGCD = 0;
        for (int j = i; j < nums.length; j++) {
            currGCD = gcd(nums[j], currGCD);

            if (currGCD == k) count++;
            else if (currGCD < k) break;
        }
    }

    return count;
}

References

[1] OI wiki: 最大公约数

[2] O(N*log(max(nums))) with Explanation | Similar Question

标签:frac,gcd,nums,int,Subarrays,GCD,text,return,2447
From: https://www.cnblogs.com/GradientBoosted/p/17125293.html

相关文章

  • 「二元一次不定方程(exgcd)」P5656 【模板】二元一次不定方程 (exgcd)
    知识点:exgcdLink:Luogu为什么之前没写?因为这题出的挺晚,出的时候都忘了嘻嘻主要抄袭对象:https://www.luogu.com.cn/blog/McHf/p5656-exgcd。简述\(T\)组数据,每组数据......
  • 【ABC162E】Sum of gcd of Tuples (Hard)
    updon2022-7-13:修改若干不合适叙述。一、题意很明了,给出\(n,k\),求下面这个复杂式子的值:\[\sum_{a_1=1}^k\sum_{a_1=1}^k\cdots\sum_{a_{n-1}=1}^k\sum_{a_n=1}^k\gc......
  • Codeforces Round #838 (Div. 2)-D. GCD Queries-GCD、交互
    题目:https://codeforces.com/problemset/problem/1762/D有一个0~n-1的排列,你要在至多2n次询问中找到两个位置x,y,使得\(p_x,p_y\)至少有一者为0.每次询问可以问两个不同的i......
  • codeforces 1047C. Enlarge GCD(数学)
    题意:给出n个数,求出最少删除几个数可以扩大最大公因子。AC代码:#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<set>#include<map>#includ......
  • 扩展欧几里得(exgcd)
    这里先说一下最大公约数怎么求,辗转相除法都会用,这里讲一下站桩相除法的原理。例如两个数假设这两个数大小,设是这两个数的最大公约数。可得因为这里都是一个正整数不会对最......
  • HDU 5223 GCD
    Description:Inmathematics,thegreatestcommondivisor(gcd......
  • Luogu5435 基于值域预处理的快速 GCD & Leetcode2543 - binary GCD -
    题目链接:https://www.luogu.com.cn/problem/P5435请忽略题目名称学到一个科技:binaryGCD,能够快速求出两个数GCD(从这道题来看已经接近\(O(1)\)了)代码://bySkyRainW......
  • CodeForces 1762D GCD Queries
    Preface比较神仙的交互题,居然自己胡出来了。不是很建议拿到题直接往题解区冲,这种题做一道少一道。Solution下面简称\(\gcd(p_i,p_j)\)为\(\text{zyf}(i,j)\)。这个......
  • Exgcd(扩展欧几里得算法)
    其实挺简单。GCD(辗转相除法)定理:\[\gcd(a,b)=\gcd(b,a\%b)\]证明:\[\text{设}a=kb+r\text{,则}r=a\bmodb\]\[\text{若}c\text{是}a,b\te......
  • Codeforces Round #846 (Div. 2) B. GCD Partition
    B.GCDPartition参考题解链接:CodeforcesRound#846(Div.2)—Tutorial-Codeforces题意:给一个长度为n的序列,并将其分成连续的k块(k>1),得到序列......