题目表述:
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 nums 的 子数组 中满足 元素最小公倍数为 k 的子数组数目。
子数组 是数组中一个连续非空的元素序列。
数组的最小公倍数 是可被所有数组元素整除的最小正整数。
示例 1 :
输入:nums = [3,6,2,7,1], k = 6
输出:4
解释:以 6 为最小公倍数的子数组是:
- [3,6,2,7,1]
- [3,6,2,7,1]
- [3,6,2,7,1]
- [3,6,2,7,1]
示例 2 :
输入:nums = [3], k = 2
输出:0
解释:不存在以 2 为最小公倍数的子数组。
提示:
1 <= nums.length <= 1000
1 <= nums[i], k <= 1000
完整思路:
通过枚举出所有子数组来测试各个子数组是否最小公倍数为k
ps:注意如果是第一层for循环得到的最小公倍数已经大于k时,可以直接break结束本次for循环。
完整代码:
- class Solution {
- public:
- int subarrayLCM(vector<int>& nums, int k) {
- int count_s=0;
- for(int i=0;i
size();i++) - {
- int g=nums[i];
- for(int j=i;j
size();j++) - {
- g=lcm(g,nums[j]);
- if(g==k)
- count_s++;
- if(g>k)
- break;
- }
- }
- return count_s;
- }
- };
内置库函数: gcd()最大公因数 lcm()最小公倍数 头文件numeric
也可用万能头文件bits/stdc++.h声明