用 C++ 统计 GCD 等于给定数字的集合子集个数
给定一个包含正数的数组 arr 和一个包含 gcd 值的数组 GCD[]。目标是找到 arr[] 元素的子集个数,其 gcd 值与 GCD[] 中给定的值相同。
例如
输入
arr[] = {10, 5, 6, 3}, GCD[] = {2, 3, 5}
输出
Count of number of subsets of a set with GCD equal to a given number are: 1 2 2
解释
The subsets with GCD equal to 2 is [ 10, 6 ]. Subsets with GCD equal to 3 is [ 3 ], [ 6,3 ] Subsets with GCD equal to 5 is [ 5 ], [ 10, 5 ]
输入
arr[] = {10, 21, 7, 8}, GCD[] = {2, 7, 5}
输出
Count of number of subsets of a set with GCD equal to a given number are: 1 2 0
解释
The subsets with GCD equal to 2 is [ 10, 8 ]. Subsets with GCD equal to 7 is [ 7 ], [ 21,7 ] There are no subsets with GCD equal to 5.
下面程序中使用的方案如下 −
在这个方案中,我们将创建一个无序映射 `unordered_map
为 arr[] 和 GCD[] 准备两个数组。
函数 `subset_GCD(int arr[], int size_arr, int GCD[], int size_GCD)` 获取这两个数组及其长度,并返回 GCD 等于给定数字的集合子集个数。
函数 `subset_GCD(int arr[], int size_arr, int GCD[], int size_GCD)` 获取这两个数组及其长度,并返回 GCD 等于给定数字的集合子集个数。
将初始计数设置为 0。
使用 for 循环遍历 arr[],找到最大值并更新计数,并使用 `um_1[arr[i]]++` 更新 `um_1` 中的频率。
使用 for 循环从 i=count 到 i>=1,将 total 作为 i 的倍数频率之和,并将 temp=0 作为 gcd 大于 i 但不等于 i 的子集个数。
再次从 j=2 到 j*i<=count 循环,将 `um_1[j*i]` 加到 total 中,并将 `um_2[j*i]` 加到 temp 中。
两个 for 循环结束后,设置 `um_2[i] = (1<
打印 `um_2[GCD[i]]`,得到具有给定 GCD 的子集个数的最终数组。
示例
#include<bits/stdc++.h> using namespace std; void subset_GCD(int arr[], int size_arr, int GCD[], int size_GCD){ unordered_map<int, int> um_1, um_2; int count = 0; for (int i=0; i<size_arr; i++){ count = max(count, arr[i]); um_1[arr[i]]++; } for (int i = count; i >=1; i−−){ int temp = 0; int total = um_1[i]; for (int j = 2; j*i <= count; j++){ total += um_1[j*i]; temp += um_2[j*i]; } um_2[i] = (1<<total) − 1 − temp; } cout<<"Count of number of subsets of a set with GCD equal to a given number are: "; for (int i=0; i<size_GCD ; i++){ cout<<um_2[GCD[i]]<<" "; } } int main(){ int GCD[] = {2, 3}; int arr[] = {9, 6, 2}; int size_arr = sizeof(arr)/sizeof(arr[0]); int size_GCD = sizeof(GCD)/sizeof(GCD[0]); subset_GCD(arr, size_arr, GCD, size_GCD); return 0; }
输出
如果我们运行以上代码,它将生成以下输出:
Count of number of subsets of a set with GCD equal to a given number are: 2 1