题意
中文,给你一个序列,任意组合成多个子序列,求子序列的最大公因数有多少个
思路
先看数据范围,num[i]最大只到2e5,故可以枚举其各个子序列的最大公因数,如何判断的话可以用到素数筛的思想,具体实现看代码
class Solution {
public:
bool vis[200010];
int mx;
int gcd(int a, int b){return b==0?a:gcd(b,a%b);}
bool check(int x){
int t = 0;
for(int i = x; i <= mx; i+=x) //类素数筛
if(vis[i]){
if(t==0) t = i;
else t = gcd(t,i);
}
return t==x;
}
int countDifferentSubsequenceGCDs(vector<int>& nums) {
mx = *max_element(nums.begin(), nums.end()); //整个数组中的最大值
for(int i = 0; i < nums.size(); i++) vis[nums[i]] = 1; //记录
int ans = 0;
for(int i = 1; i <= mx; i++) if(check(i)) ans++; //枚举最大公因数
return ans;
}
};