📜  计算长度为N的字母数字回文

📅  最后修改于: 2021-04-30 02:59:30             🧑  作者: Mango

给定正整数N ,任务是找到长度为N的字母数字回文字符串的数量。由于此类字符串的数量可能很大,因此请以10 9 + 7为模输出答案。

例子:

天真的方法:最简单的方法是生成所有可能的长度为N的字母数字字符串,并针对每个字符串检查它是否是回文式。因为在每个位置上总共可以放置62个字符。因此,有62 N个可能的字符串。

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

高效的方法:为了优化上述方法,其思想是利用回文的性质。可以看出,如果字符串的长度是偶数,则对于从0到N / 2的每个索引i ,索引i(N – 1 – i)处的字符都是相同的。因此,对于从0N / 2的每个位置,都有62 N / 2个选项。同样,如果长度为奇数,则存在62 (N + 1)/ 2个选项。因此,可以说,对于一些N ,有62个ceil(N / 2)个可能的回文字符串。
请按照以下步骤解决问题:

  • 对于给定的N值,使用模幂计算62 ceil(N / 2) mod 10 9 + 7
  • 62 ceil(N / 2) mod 10 9 + 7打印为所需答案。

下面是上述方法的实现:

C++14
// C++ program for the
// above approach
#include 
using namespace std;
 
// Function to calculate
// (x ^ y) mod p
int power(int x, int y,
          int p)
{
  // Initialize result
  int res = 1;
 
  // Update x if it is more
  // than or equal to p
  x = x % p;
 
  if (x == 0)
    return 0;
 
  while (y > 0)
  {
    // If y is odd, multiply
    // x with result
    if ((y & 1) == 1)
      res = (res * x) % p;
 
    // y must be even now
    y = y >> 1;
    x = (x * x) % p;
  }
 
  // Return the final
  // result
  return res;
}
 
// Driver Code
int main()
{   
  // Given N
  int N = 3;
  int flag, k, m;
 
  // Base Case
  if((N == 1) ||
     (N == 2))
    cout << 62;
 
  else
    m = 1000000000 + 7;
 
  // Check whether n
  // is even or odd
  if(N % 2 == 0)
  {
    k = N / 2;
    flag = true;
  }
  else
  {
    k = (N - 1) / 2;
    flag = false;
  }
  if(flag != 0)
  {      
    // Function Call
    int a = power(62,
                  k, m);
    cout << a;
  }
  else
  {
    // Function Call
    int a = power(62,
                  (k + 1), m);
    cout << a;
  }
}
 
// This code is contributed by sanjoy_62


Java
// Java program for the
// above approach
import java.util.*;
class GFG{
 
// Function to calculate
// (x ^ y) mod p
static int power(int x,
                 int y, int p)
{
  // Initialize result
  int res = 1;
 
  // Update x if it is more
  // than or equal to p
  x = x % p;
 
  if (x == 0)
    return 0;
 
  while (y > 0)
  {
    // If y is odd, multiply
    // x with result
    if ((y & 1) == 1)
      res = (res * x) % p;
 
    // y must be even now
    y = y >> 1;
    x = (x * x) % p;
  }
 
  // Return the final
  // result
  return res;
}
 
// Driver Code
public static void main(String[] args)
{
  // Given N
  int N = 3;
  int flag, k, m =0;
 
  // Base Case
  if ((N == 1) || (N == 2))
    System.out.print(62);
  else
    m = 1000000000 + 7;
 
  // Check whether n
  // is even or odd
  if (N % 2 == 0)
  {
    k = N / 2;
    flag = 1;
  }
  else
  {
    k = (N - 1) / 2;
    flag = 0;
  }
   
  if (flag != 0)
  {
    // Function Call
    int a = power(62, k, m);
    System.out.print(a);
  }
  else
  {
    // Function Call
    int a = power(62, (k + 1), m);
    System.out.print(a);
  }
}
}
 
// This code is contributed by 29AjayKumar


Python3
# Python3 program for the above approach
 
# Function to calculate (x ^ y) mod p
def power(x, y, p):
 
    # Initialize result
    res = 1
 
    # Update x if it is more
    # than or equal to p
    x = x % p
 
    if (x == 0):
        return 0
 
    while (y > 0):
 
        # If y is odd, multiply
        # x with result
        if ((y & 1) == 1):
            res = (res * x) % p
 
        # y must be even now
        y = y >> 1
        x = (x * x) % p
 
    # Return the final result
    return res
 
 
# Driver Code
 
# Given N
N = 3
 
# Base Case
if((N == 1) or (N == 2)):
    print(62)
     
else:
 
    m = (10**9)+7
 
    # Check whether n
    # is even or odd
    if(N % 2 == 0):
        k = N//2
        flag = True
    else:
        k = (N - 1)//2
        flag = False
         
    if(flag):
       
        # Function Call
        a = power(62, k, m)
        print(a)
    else:
 
        # Function Call
        a = power(62, (k + 1), m)
        print(a)


C#
// C# program for the
// above approach
using System;
 
class GFG{
 
// Function to calculate
// (x ^ y) mod p
static int power(int x, int y,
                 int p)
{
   
  // Initialize result
  int res = 1;
 
  // Update x if it is more
  // than or equal to p
  x = x % p;
 
  if (x == 0)
    return 0;
 
  while (y > 0)
  {
     
    // If y is odd, multiply
    // x with result
    if ((y & 1) == 1)
      res = (res * x) % p;
 
    // y must be even now
    y = y >> 1;
    x = (x * x) % p;
  }
 
  // Return the final
  // result
  return res;
}
 
// Driver Code
public static void Main()
{
   
  // Given N
  int N = 3;
  int flag, k, m = 0;
 
  // Base Case
  if ((N == 1) || (N == 2))
    Console.Write(62);
  else
    m = 1000000000 + 7;
 
  // Check whether n
  // is even or odd
  if (N % 2 == 0)
  {
    k = N / 2;
    flag = 1;
  }
  else
  {
    k = (N - 1) / 2;
    flag = 0;
  }
   
  if (flag != 0)
  {
    // Function Call
    int a = power(62, k, m);
    Console.Write(a);
  }
  else
  {
     
    // Function Call
    int a = power(62, (k + 1), m);
    Console.Write(a);
  }
}
}
 
// This code is contributed by code_hunt


输出:
3844










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