在 C++ 中计算数组中满足 LCM(arr[i], arr[j]) > min(arr[i],arr[j]) 的对数


给定一个正整数数组。目标是找到 arr[] 元素对的数量,使得条件 LCM( arr[i], arr[j] ) > min( arr[i], arr[j] ) 成立。也就是说,一对元素的最小公倍数大于两者中的最小值。

注意 - 对 ( arr[i], arr[j] ) 与 ( arr[j],arr[i] ) 相同。不要重复计算。

让我们通过例子来理解。

输入 - arr[] = [ 1,5,4,2 ]

输出 - 满足 LCM(arr[i], arr[j]) > min(arr[i],arr[j]) 的数组中对数为 - 6

解释 - 共有 6 对 -

Pair 1 (1,5) LCM is 5 > 1
Pair 2 (1,4) LCM is 4 > 1
Pair 3 (1,2) LCM is 2 > 1
Pair 4 (5,4) LCM is 20 > 4
Pair 5 (5,2) LCM is 10 > 2
Pair 6 (4,2) LCM is 4 > 2

输入 - arr[] = [ 3,3,6 ]

输出 - 满足 LCM(arr[i], arr[j]) > min(arr[i],arr[j]) 的数组中对数为 - 2

解释 - 共有 2 对 -

Pair 1 (3,6) LCM is 6 > 3
Pair 2 (3,6) LCM is 6 > 3

下面程序中使用的方案如下

只有当 arr[i]==arr[j] 时,上述条件才为假。对将在唯一元素之间形成。使用一个无序映射,其中包含数组唯一元素的频率。现在删除所有相似的元素对。为每个频率计算最大对数为 ( freq * (freq-1)/2 )。将所有此类计算添加到计数中。

总数组大小为元素,则最大对数=size(size-1)/2。

结果将为 pairs-count。(所有对 - 具有相同元素的对)。

获取一个整数数组。

  • 获取一个整数数组。

  • 函数 conditional_pair(int arr[], int size) 获取数组及其大小,并返回满足条件的对数。

  • 将初始计数设为 0。

  • 获取 unordered_map<int, int> um 用于 arr[] 的元素及其频率。

  • 使用 for 遍历映射,对于每个频率 temp = it.second;(it=迭代器)将 temp*(temp-1)/2 添加到计数中。temp 个元素的所有可能对。

  • 现在 count 包含所有相同元素的对,在我们的案例中将不考虑这些对。

  • 计算数组元素的总可能对数为 temp=size*(size-1)/2。

  • 将 count 更新为 count - temp。

  • 返回 count 作为结果。

示例

 实时演示

#include <bits/stdc++.h>
using namespace std;
int conditional_pair(int arr[], int size){
   int count = 0;
   unordered_map<int, int> um;
   for (int i = 0; i < size; i++){
      um[arr[i]]++;
   }
   for (auto it : um){
      int temp = it.second;
      count = count + temp * (temp - 1) / 2;
   }
   int temp = (size * (size - 1)) / 2;
   count = temp - count;
   return count;
}
int main(){
   int arr[] = { 4, 1, 7, 3, 2};
   int size = sizeof(arr) / sizeof(arr[0]);
   cout<<"Count of pairs in an array such that LCM(arr[i], arr[j]) > min(arr[i],arr[j]) are:
"<<conditional_pair(arr, size);
   return 0;
}

输出

如果我们运行以上代码,它将生成以下输出 -

Count of pairs in an array such that LCM(arr[i], arr[j]) > min(arr[i],arr[j]) are: 10

更新于: 2020-12-02

200 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告