funccountBeautifulPairs(nums []int)int { var res int for i, x := range nums { for x >= 10 { x /= 10 } for j := i + 1; j < len(nums); j++ { y := nums[j] % 10 if gcd(x, y) == 1 { res++ } } } return res }
funcgcd(a, b int)int { for a != 0 { a, b = b%a, a } return b }
funccountBeautifulPairs(nums []int)int { cnt := [10]int{} res := 0 for _, x := range nums { for y := 1; y < 10; y++ { if cnt[y] > 0 && gcd(x%10, y) == 1 { // 这里y 表示最高位,出现过最高位,且与最低位互质 res += cnt[y] } } for x >= 10 { x /= 10 } cnt[x] ++ // 统计最高位的出现次数 } return res }
2749. 得到整数零需要执行的最少操作数
枚举:
假设操作了 k 次,那么操作后 num1 变成 num1−num2×k−k×2i=0
此时问题变成:num1−num2×k 能否拆分成 k 个 2i 之和?
设 x=num1−num2×k,可以看出至少需要 bits.OnesCount(x) 个 2i 磁能凑成 x (bits.OnesCount 表示 x 二进制中 1 的个数);同时,最多只能用 x 个 20=1 凑出 x,也就是说,只要 k 满足 bits.OnesCount(x)≤k≤x 就是一个合法的 k。
因为每个 2i 都可以拆分为两个 2i−1,所以 bits.OnesCount(x) 到 x 之间的所有值都是符合要求的。
从小到大遍历,获取到第一个合法的 k 即可返回答案。
1 2 3 4 5 6 7 8
funcmakeTheIntegerZero(num1 int, num2 int)int { for k := 1; k <= num1-num2*k; k++ { if k >= bits.OnesCount(uint(num1-num2*k)) { return k } } return-1 }
funcnumberOfGoodSubarraySplits(nums []int)int { const mod = 1e9 + 7 res, pre := 1, -1 for i, num := range nums { if num > 0 { if pre >= 0 { res = res * (i - pre) % mod } pre = i } } if pre < 0 { return0 } return res }