📜  X位数为一位的N位数的计数

📅  最后修改于: 2021-04-28 14:21:20             🧑  作者: Mango

给定一个整数N ,任务是找到N位数字的总数,以使这些数字的位的按位XOR为单个数字。

例子:

方法:天真的方法是迭代所有N位数字,并检查该数字所有数字的按位XOR是否为单个数字。如果是,则将其包括在计数中,否则,请检查下一个数字。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to find count of N-digit
// numbers with single digit XOR
void countNums(int N)
{
     
    // Range of numbers
    int l = (int)pow(10, N - 1);
    int r = (int)pow(10, N) - 1;
 
    int count = 0;
    for(int i = l; i <= r; i++)
    {
        int xorr = 0, temp = i;
 
        // Calculate XOR of digits
        while (temp > 0)
        {
            xorr = xorr ^ (temp % 10);
            temp /= 10;
        }
 
        // If XOR <= 9,
        // then increment count
        if (xorr <= 9)
            count++;
    }
     
    // Print the count
    cout << count;
}
 
// Driver Code
int main()
{
     
    // Given number
    int N = 2;
 
    // Function call
    countNums(N);
}
 
// This code is contributed by code_hunt


Java
// Java program for the above approach
 
class GFG {
 
    // Function to find count of N-digit
    // numbers with single digit XOR
    public static void countNums(int N)
    {
        // Range of numbers
        int l = (int)Math.pow(10, N - 1),
            r = (int)Math.pow(10, N) - 1;
 
        int count = 0;
 
        for (int i = l; i <= r; i++) {
            int xor = 0, temp = i;
 
            // Calculate XOR of digits
            while (temp > 0) {
                xor = xor ^ (temp % 10);
                temp /= 10;
            }
 
            // If XOR <= 9,
            // then increment count
            if (xor <= 9)
                count++;
        }
 
        // Print the count
        System.out.println(count);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        // Given Number
        int N = 2;
 
        // Function Call
        countNums(N);
    }
}


Python3
# Python3 program for the above approach
 
# Function to find count of N-digit
# numbers with single digit XOR
def countNums(N):
     
    # Range of numbers
    l = pow(10, N - 1)
    r = pow(10, N) - 1
 
    count = 0
    for i in range(l, r + 1):
        xorr = 0
        temp = i
 
        # Calculate XOR of digits
        while (temp > 0):
            xorr = xorr ^ (temp % 10)
            temp //= 10
         
        # If XOR <= 9,
        # then increment count
        if (xorr <= 9):
            count += 1
         
    # Print the count
    print(count)
 
# Driver Code
 
# Given number
N = 2
 
# Function call
countNums(N)
 
# This code is contributed by code_hunt


C#
// C# program for the above approach
using System;
 
class GFG{
 
// Function to find count of N-digit
// numbers with single digit XOR
public static void countNums(int N)
{
     
    // Range of numbers
    int l = (int)Math.Pow(10, N - 1),
        r = (int)Math.Pow(10, N) - 1;
 
    int count = 0;
 
    for(int i = l; i <= r; i++)
    {
        int xor = 0, temp = i;
 
        // Calculate XOR of digits
        while (temp > 0)
        {
            xor = xor ^ (temp % 10);
            temp /= 10;
        }
 
        // If XOR <= 9,
        // then increment count
        if (xor <= 9)
            count++;
    }
 
    // Print the count
    Console.WriteLine(count);
}
 
// Driver Code
public static void Main()
{
     
    // Given number
    int N = 2;
 
    // Function call
    countNums(N);
}
}
 
// This code is contributed by code_hunt


Javascript


C++
// C++ program for
// the above approach
#include
using namespace std;
 
// Function to find
// count of N-digit
// numbers with single
// digit XOR
void countNums(int N)
{ 
  // dp[i][j] stores the number
  // of i-digit numbers with
  // XOR equal to j
  int dp[N][16];
  memset(dp, 0,
         sizeof(dp[0][0]) *
                N * 16);
 
  // For 1-9 store the value
  for (int i = 1; i <= 9; i++)
    dp[0][i] = 1;
 
  // Iterate till N
  for (int i = 1; i < N; i++)
  {
    for (int j = 0; j < 10; j++)
    {
      for (int k = 0; k < 16; k++)
      {
        // Calculate XOR
        int xo = j ^ k;
 
        // Store in DP table
        dp[i][xo] += dp[i - 1][k];
      }
    }
  }
 
  // Initialize count
  int count = 0;
  for (int i = 0; i < 10; i++)
    count += dp[N - 1][i];
 
  // Print the answer
  cout << (count) << endl;
}
  
// Driver Code
int main()
{
  // Given number N
  int N = 1;
 
  // Function Call
  countNums(N);
}
 
// This code is contributed by Chitranayal


Java
// Java program for the above approach
 
class GFG {
 
    // Function to find count of N-digit
    // numbers with single digit XOR
    public static void countNums(int N)
    {
 
        // dp[i][j] stores the number
        // of i-digit numbers with
        // XOR equal to j
        int dp[][] = new int[N][16];
 
        // For 1-9 store the value
        for (int i = 1; i <= 9; i++)
            dp[0][i] = 1;
 
        // Iterate till N
        for (int i = 1; i < N; i++) {
 
            for (int j = 0; j < 10; j++) {
 
                for (int k = 0; k < 16; k++) {
 
                    // Calculate XOR
                    int xor = j ^ k;
 
                    // Store in DP table
                    dp[i][xor] += dp[i - 1][k];
                }
            }
        }
 
        // Initialize count
        int count = 0;
        for (int i = 0; i < 10; i++)
            count += dp[N - 1][i];
 
        // Print the answer
        System.out.println(count);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        // Given number N
        int N = 1;
 
        // Function Call
        countNums(N);
    }
}


Python3
# Python3 program for the
# above approach
 
# Function to find count of
# N-digit numbers with single
# digit XOR
def countNums(N):
   
    # dp[i][j] stores the number
    # of i-digit numbers with
    # XOR equal to j
    dp = [[0 for i in range(16)]
             for j in range(N)];
 
    # For 1-9 store the value
    for i in range(1, 10):
        dp[0][i] = 1;
 
    # Iterate till N
    for i in range(1, N):
        for j in range(0, 10):
            for k in range(0, 16):
                # Calculate XOR
                xor = j ^ k;
 
                # Store in DP table
                dp[i][xor] += dp[i - 1][k];
 
    # Initialize count
    count = 0;
    for i in range(0, 10):
        count += dp[N - 1][i];
 
    # Print answer
    print(count);
 
# Driver Code
if __name__ == '__main__':
   
    # Given number N
    N = 1;
 
    # Function Call
    countNums(N);
 
# This code is contributed by shikhasingrajput


C#
// C# program for the above approach
using System;
 
class GFG{
 
// Function to find count of N-digit
// numbers with single digit XOR
public static void countNums(int N)
{
 
    // dp[i][j] stores the number
    // of i-digit numbers with
    // XOR equal to j
    int [,]dp = new int[N, 16];
 
    // For 1-9 store the value
    for(int i = 1; i <= 9; i++)
        dp[0, i] = 1;
 
    // Iterate till N
    for(int i = 1; i < N; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            for (int k = 0; k < 16; k++)
            {
 
                // Calculate XOR
                int xor = j ^ k;
 
                // Store in DP table
                dp[i, xor] += dp[i - 1, k];
            }
        }
    }
 
    // Initialize count
    int count = 0;
    for(int i = 0; i < 10; i++)
        count += dp[N - 1, i];
 
    // Print the answer
    Console.Write(count);
}
 
// Driver Code
public static void Main(string[] args)
{
     
    // Given number N
    int N = 1;
 
    // Function call
    countNums(N);
}
}
 
// This code is contributed by rutvik_56


输出:
66

时间复杂度: O(N * 10 N )
辅助空间: O(1)

高效的方法:这个想法是使用动态编程。请注意,可以获取的最大按位XOR为15。

  1. 创建一个表dp [] [] ,其中dp [i] [j]存储i位数字的计数,以使其XOR为j
  2. 初始化dp [] [],使i = 1,并为每个i形成2到N,对从0到9的每个数字j进行迭代。
  3. 对于从0到15的每个可能的先前XOR k ,通过对先前XOR k与数字j进行XOR求出,然后将dp [i] [value]的计数增加dp [i – 1] [k]
  4. 可以通过对dp [N] [j]求和来找到具有一位数字XOR的N位数字的总数,其中j的范围是0到9

下面是上述方法的实现:

C++

// C++ program for
// the above approach
#include
using namespace std;
 
// Function to find
// count of N-digit
// numbers with single
// digit XOR
void countNums(int N)
{ 
  // dp[i][j] stores the number
  // of i-digit numbers with
  // XOR equal to j
  int dp[N][16];
  memset(dp, 0,
         sizeof(dp[0][0]) *
                N * 16);
 
  // For 1-9 store the value
  for (int i = 1; i <= 9; i++)
    dp[0][i] = 1;
 
  // Iterate till N
  for (int i = 1; i < N; i++)
  {
    for (int j = 0; j < 10; j++)
    {
      for (int k = 0; k < 16; k++)
      {
        // Calculate XOR
        int xo = j ^ k;
 
        // Store in DP table
        dp[i][xo] += dp[i - 1][k];
      }
    }
  }
 
  // Initialize count
  int count = 0;
  for (int i = 0; i < 10; i++)
    count += dp[N - 1][i];
 
  // Print the answer
  cout << (count) << endl;
}
  
// Driver Code
int main()
{
  // Given number N
  int N = 1;
 
  // Function Call
  countNums(N);
}
 
// This code is contributed by Chitranayal

Java

// Java program for the above approach
 
class GFG {
 
    // Function to find count of N-digit
    // numbers with single digit XOR
    public static void countNums(int N)
    {
 
        // dp[i][j] stores the number
        // of i-digit numbers with
        // XOR equal to j
        int dp[][] = new int[N][16];
 
        // For 1-9 store the value
        for (int i = 1; i <= 9; i++)
            dp[0][i] = 1;
 
        // Iterate till N
        for (int i = 1; i < N; i++) {
 
            for (int j = 0; j < 10; j++) {
 
                for (int k = 0; k < 16; k++) {
 
                    // Calculate XOR
                    int xor = j ^ k;
 
                    // Store in DP table
                    dp[i][xor] += dp[i - 1][k];
                }
            }
        }
 
        // Initialize count
        int count = 0;
        for (int i = 0; i < 10; i++)
            count += dp[N - 1][i];
 
        // Print the answer
        System.out.println(count);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        // Given number N
        int N = 1;
 
        // Function Call
        countNums(N);
    }
}

Python3

# Python3 program for the
# above approach
 
# Function to find count of
# N-digit numbers with single
# digit XOR
def countNums(N):
   
    # dp[i][j] stores the number
    # of i-digit numbers with
    # XOR equal to j
    dp = [[0 for i in range(16)]
             for j in range(N)];
 
    # For 1-9 store the value
    for i in range(1, 10):
        dp[0][i] = 1;
 
    # Iterate till N
    for i in range(1, N):
        for j in range(0, 10):
            for k in range(0, 16):
                # Calculate XOR
                xor = j ^ k;
 
                # Store in DP table
                dp[i][xor] += dp[i - 1][k];
 
    # Initialize count
    count = 0;
    for i in range(0, 10):
        count += dp[N - 1][i];
 
    # Print answer
    print(count);
 
# Driver Code
if __name__ == '__main__':
   
    # Given number N
    N = 1;
 
    # Function Call
    countNums(N);
 
# This code is contributed by shikhasingrajput

C#

// C# program for the above approach
using System;
 
class GFG{
 
// Function to find count of N-digit
// numbers with single digit XOR
public static void countNums(int N)
{
 
    // dp[i][j] stores the number
    // of i-digit numbers with
    // XOR equal to j
    int [,]dp = new int[N, 16];
 
    // For 1-9 store the value
    for(int i = 1; i <= 9; i++)
        dp[0, i] = 1;
 
    // Iterate till N
    for(int i = 1; i < N; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            for (int k = 0; k < 16; k++)
            {
 
                // Calculate XOR
                int xor = j ^ k;
 
                // Store in DP table
                dp[i, xor] += dp[i - 1, k];
            }
        }
    }
 
    // Initialize count
    int count = 0;
    for(int i = 0; i < 10; i++)
        count += dp[N - 1, i];
 
    // Print the answer
    Console.Write(count);
}
 
// Driver Code
public static void Main(string[] args)
{
     
    // Given number N
    int N = 1;
 
    // Function call
    countNums(N);
}
}
 
// This code is contributed by rutvik_56
输出:
9

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