📌  相关文章
📜  串联时可被K整除的Array元素对数

📅  最后修改于: 2021-05-17 04:56:58             🧑  作者: Mango

给定一个数组arr []和一个整数K ,任务是对索引对(i,j)进行计数,以使i!= j以及a [i]a [j]的连接可被K整除。

例子:

天真的方法:
解决问题的最简单方法如下:

  • 使用带有变量ij的嵌套循环遍历数组。
  • 对于每个i!= j ,通过等式连接arr [i]arr [j]
  • K检查连接数的可除性
  • 对于所有这样的(arr [i],arr [j])对,增加count
  • 打印count的最终值。

时间复杂度: O(N 2 * len(maxm),其中maxm表示数组中的最大元素,len(maxm)表示maxm的位数。

辅助空间: O(1)
高效方法:

要优化上述方法,请按照以下步骤操作:

  • 要应用上述公式,请为110的每个长度维护一个Map。
  • 在地图中存储{ len [a [i]]a [i]%k }。
  • 计数对,对每个j[1,10],(K – )%K((ARR [I] * 10 ^ j)的)的频率增加的计数存储在地图{J,K – ((arr [i] * 10 ^ j)%k)}映射。
  • 如果对(arr [i],arr [i])进行计数,则将计数减少1
  • 遍历数组后,打印最终计数

下面是上述方法的实现:

C++
// C++ Program to count pairs
// of array elements which are
// divisible by K when concatenated
#include 
using namespace std;
 
map rem[11];
 
// Function to calculate and return the
// count of pairs
int countPairs(vector a, int n, int k)
{
 
    vector len(n);
 
    // Compute power of 10 modulo k
    vector p(11);
    p[0] = 1;
    for (int i = 1; i <= 10; i++) {
        p[i] = (p[i - 1] * 10) % k;
    }
 
    for (int i = 0; i < n; i++) {
        int x = a[i];
 
        // Calculate length of a[i]
        while (x > 0) {
            len[i]++;
            x /= 10;
        }
 
        // Increase count of remainder
        rem[len[i]][a[i] % k]++;
    }
 
    int ans = 0;
 
    for (int i = 0; i < n; i++) {
 
        for (int j = 1; j <= 10; j++) {
 
            // Calculate (a[i]* 10^lenj) % k
            int r = (a[i] * p[j]) % k;
 
            // Calculate (k - (a[i]* 10^lenj)% k) % k
            int xr = (k - r) % k;
 
            // Increase answer by count
            ans += rem[j][xr];
 
            // If a pair (a[i], a[i]) is counted
            if (len[i] == j
                && (r + a[i] % k) % k == 0)
                ans--;
        }
    }
 
    // Return the count of pairs
    return ans;
}
 
// Driver Code
int main()
{
    vector a = { 4, 5, 2 };
    int n = a.size(), k = 2;
    cout << countPairs(a, n, k);
}


Java
// Java program to count pairs
// of array elements which are
// divisible by K when concatenated
import java.util.*;
import java.lang.*;
 
class GFG{
     
static int[][] rem = new int[11][11];
 
// Function to calculate and return the
// count of pairs
static int countPairs(int[] a, int n, int k)
{
    int[] len = new int[n];
     
    // Compute power of 10 modulo k
    int[] p = new int[11];
    p[0] = 1;
     
    for(int i = 1; i <= 10; i++)
    {
        p[i] = (p[i - 1] * 10) % k;
    }
     
    for(int i = 0; i < n; i++)
    {
        int x = a[i];
 
        // Calculate length of a[i]
        while (x > 0)
        {
            len[i]++;
            x /= 10;
        }
         
        // Increase count of remainder
        rem[len[i]][a[i] % k]++;
    }
 
    int ans = 0;
 
    for(int i = 0; i < n; i++)
    {
        for(int j = 1; j <= 10; j++)
        {
             
            // Calculate (a[i]* 10^lenj) % k
            int r = (a[i] * p[j]) % k;
 
            // Calculate (k - (a[i]* 10^lenj)% k) % k
            int xr = (k - r) % k;
 
            // Increase answer by count
            ans += rem[j][xr];
 
            // If a pair (a[i], a[i]) is counted
            if (len[i] == j &&
             (r + a[i] % k) % k == 0)
                ans--;
        }
    }
 
    // Return the count of pairs
    return ans;
}  
 
// Driver code
public static void main (String[] args)
{
    int[] a = { 4, 5, 2 };
    int n = a.length, k = 2;
     
    System.out.println(countPairs(a, n, k));
}
}
 
// This code is contributed by offbeat


Python3
# Python3 program to count pairs
# of array elements which are
# divisible by K when concatenated
rem = [ [ 0 for x in range(11) ]
            for y in range(11) ]
 
# Function to calculate and return the
# count of pairs
def countPairs(a, n, k):
 
    l = [0] * n
 
    # Compute power of 10 modulo k
    p = [0] * (11)
    p[0] = 1
     
    for i in range(1, 11):
        p[i] = (p[i - 1] * 10) % k
 
    for i in range(n):
        x = a[i]
 
        # Calculate length of a[i]
        while (x > 0):
            l[i] += 1
            x //= 10
         
        # Increase count of remainder
        rem[l[i]][a[i] % k] += 1
     
    ans = 0
 
    for i in range(n):
        for j in range(1, 11):
 
            # Calculate (a[i]* 10^lenj) % k
            r = (a[i] * p[j]) % k
 
            # Calculate (k - (a[i]* 10^lenj)% k) % k
            xr = (k - r) % k
 
            # Increase answer by count
            ans += rem[j][xr]
 
            # If a pair (a[i], a[i]) is counted
            if (l[i] == j and
               (r + a[i] % k) % k == 0):
                ans -= 1
 
    # Return the count of pairs
    return ans
 
# Driver Code
a = [ 4, 5, 2 ]
n = len(a)
k = 2
 
print(countPairs(a, n, k))
 
# This code is contributed by chitranayal


C#
// C# program to count pairs
// of array elements which are
// divisible by K when concatenated
using System;
class GFG{
      
static int [,]rem = new int[11, 11];
  
// Function to calculate and
// return the count of pairs
static int countPairs(int[] a,
                      int n, int k)
{
  int[] len = new int[n];
 
  // Compute power of 10 modulo k
  int[] p = new int[11];
  p[0] = 1;
 
  for(int i = 1; i <= 10; i++)
  {
    p[i] = (p[i - 1] * 10) % k;
  }
 
  for(int i = 0; i < n; i++)
  {
    int x = a[i];
 
    // Calculate length of a[i]
    while (x > 0)
    {
      len[i]++;
      x /= 10;
    }
 
    // Increase count of remainder
    rem[len[i], a[i] % k]++;
  }
 
  int ans = 0;
 
  for(int i = 0; i < n; i++)
  {
    for(int j = 1; j <= 10; j++)
    {
      // Calculate (a[i]* 10^lenj) % k
      int r = (a[i] * p[j]) % k;
 
      // Calculate (k - (a[i]* 10^lenj)% k) % k
      int xr = (k - r) % k;
 
      // Increase answer by count
      ans += rem[j, xr];
 
      // If a pair (a[i], a[i]) is counted
      if (len[i] == j &&
         (r + a[i] % k) % k == 0)
        ans--;
    }
  }
 
  // Return the count of pairs
  return ans;
}  
  
// Driver code
public static void Main(string[] args)
{
  int[] a = {4, 5, 2};
  int n = a.Length, k = 2;
  Console.Write(countPairs(a, n, k));
}
}
 
// This code is contributed by rutvik_56


输出
4


时间复杂度: O(N * len(maxm))
辅助空间: O(N)