对数组中的对进行计数,以使C ++中的LCM(arr [i],arr [j])> min(arr [i],arr [j])

给我们一个正整数数组。目标是找到arr []的元素对数,以使条件LCM(arr [i],arr [j])>(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。

结果将是对数。(所有对-具有相同元素的对)。

取一个整数数组。

  • 取一个整数数组。

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

  • 将初始计数设为0。

  • 取unordered_map <int,int> um作为arr []的元素及其频率。

  • 使用for和for每个频率的导线图temp = it.second; (它=迭代器)加temp *(temp-1)/ 2进行计数。临时数量的所有可能的对。

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

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

  • 更新计数为计数-温度

  • 返回计数作为结果。

示例

#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
猜你喜欢