📜  计数来自两个数组的对,其模运算的结果为K

📅  最后修改于: 2021-04-22 00:49:18             🧑  作者: Mango

给定一个整数k和两个数组arr1arr2 ,任务是计算总数对(从中选择一个元素后形成arr1另一个来自arr2 )从这些模块的模运算得出k
注意:如果成对(a,b)中的a> b,则模必须以%b的形式执行。另外,出现不止一次的货币对将仅计算一次。

例子:

方法:

  • 从中取一个元素arr1一次与其他所有元素进行模运算arr2逐个。
  • 如果上一步的结果等于k然后将对(a,b)存储在一个集合中,以避免重复,其中a是较小的元素,b是较大的元素。
  • 所需的总对数最终将是集合的大小。

下面是上述方法的实现:

C++
// C++ implementation of above approach
#include 
using namespace std;
  
// Function to return the total pairs
// of elements whose modulo yield K
int totalPairs(int arr1[], int arr2[], int K, int n, int m)
{
  
    // set is used to avoid duplicate pairs
    set > s;
  
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
  
            // check which element is greater and
            // proceed according to it
            if (arr1[i] > arr2[j]) {
  
                // check if modulo is equal to K
                if (arr1[i] % arr2[j] == K)
                    s.insert(make_pair(arr1[i], arr2[j]));
            }
            else {
                if (arr2[j] % arr1[i] == K)
                    s.insert(make_pair(arr2[j], arr1[i]));
            }
        }
    }
  
    // return size of the set
    return s.size();
}
  
// Driver code
int main()
{
    int arr1[] = { 8, 3, 7, 50 };
    int arr2[] = { 5, 1, 10, 4 };
    int K = 3;
    int n = sizeof(arr1) / sizeof(arr1[0]);
    int m = sizeof(arr2) / sizeof(arr2[0]);
  
    cout << totalPairs(arr1, arr2, K, n, m);
    return 0;
}


Java
// Java implementation of above approach 
import java.util.*;
  
class GFG
{
    static class pair
    {
        int first, second;
        public pair(int first, int second)
        {
            this.first = first;
            this.second = second;
        }
    }
      
    // Function to return the total pairs 
    // of elements whose modulo yield K 
    static int totalPairs(int []arr1, int []arr2,
                          int K, int n, int m) 
    { 
      
        // set is used to avoid duplicate pairs 
        HashSet s = new HashSet(); 
      
        for (int i = 0; i < n; i++) 
        { 
            for (int j = 0; j < m; j++) 
            { 
      
                // check which element is greater and 
                // proceed according to it 
                if (arr1[i] > arr2[j]) 
                { 
      
                    // check if modulo is equal to K 
                    if (arr1[i] % arr2[j] == K) 
                        s.add(new pair(arr1[i], arr2[j])); 
                } 
                else
                { 
                    if (arr2[j] % arr1[i] == K) 
                        s.add(new pair(arr2[j], arr1[i])); 
                } 
            } 
        } 
      
        // return size of the set 
        return s.size(); 
    } 
      
    // Driver code 
    public static void main(String []args) 
    { 
        int []arr1 = { 8, 3, 7, 50 }; 
        int []arr2 = { 5, 1, 10, 4 }; 
        int K = 3; 
        int n = arr1.length; 
        int m = arr2.length;
      
        System.out.println(totalPairs(arr1, arr2, K, n, m)); 
    } 
}
  
// This code is contributed by Princi Singh


Python3
# Python3 implementation of above approach
  
# Function to return the total pairs
# of elements whose modulo yield K
def totalPairs(arr1, arr2, K, n, m):
  
    # set is used to avoid duplicate pairs
    s={}
  
    for i in range(n):
        for j in range(m):
  
            # check which element is greater and
            # proceed according to it
            if (arr1[i] > arr2[j]):
  
                # check if modulo is equal to K
                if (arr1[i] % arr2[j] == K):
                    s[(arr1[i], arr2[j])]=1
            else:
                if (arr2[j] % arr1[i] == K):
                    s[(arr2[j], arr1[i])]=1
  
  
  
    # return size of the set
    return len(s)
  
# Driver code
  
arr1 = [ 8, 3, 7, 50 ]
arr2 = [5, 1, 10, 4 ]
K = 3
n = len(arr1)
m = len(arr2)
  
print(totalPairs(arr1, arr2, K, n, m))
  
# This code is contributed by mohit kumar 29


C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
      
class GFG
{
    public class pair
    {
        public int first, second;
        public pair(int first, int second)
        {
            this.first = first;
            this.second = second;
        }
    }
      
    // Function to return the total pairs 
    // of elements whose modulo yield K 
    static int totalPairs(int []arr1, int []arr2,
                          int K, int n, int m) 
    { 
      
        // set is used to avoid duplicate pairs 
        HashSet s = new HashSet(); 
      
        for (int i = 0; i < n; i++) 
        { 
            for (int j = 0; j < m; j++) 
            { 
      
                // check which element is greater and 
                // proceed according to it 
                if (arr1[i] > arr2[j]) 
                { 
      
                    // check if modulo is equal to K 
                    if (arr1[i] % arr2[j] == K) 
                        s.Add(new pair(arr1[i], arr2[j])); 
                } 
                else
                { 
                    if (arr2[j] % arr1[i] == K) 
                        s.Add(new pair(arr2[j], arr1[i])); 
                } 
            } 
        } 
      
        // return size of the set 
        return s.Count; 
    } 
      
    // Driver code 
    public static void Main(String []args) 
    { 
        int []arr1 = { 8, 3, 7, 50 }; 
        int []arr2 = { 5, 1, 10, 4 }; 
        int K = 3; 
        int n = arr1.Length; 
        int m = arr2.Length;
      
        Console.WriteLine(totalPairs(arr1, arr2, K, n, m)); 
    } 
}
  
// This code is contributed by PrinciRaj1992


输出:
3

注意:要打印所有对,只需打印set的元素。