# Count all palindrome which is square of a palindrome

Given two positive integers L and R (represented as strings) where . The task is to find the total number of super-palindromes in the inclusive range [L, R].
A palindrome is called super-palindrome if it is a palindrome and also square of a palindrome.
Examples:

Input: L = "4", R = "1000"
Output: 4
Explanation: 4, 9, 121, and 484 are super-palindromes.

Input : L = "100000", R = "10000000000"
Output : 11


Approach:
Lets say is a super-palindrome.
Now since R is a palindrome, the first half of the digits of R can be used to determine R up-to two possibilities. Let i be the first half of the digits in R. For eg. if i = 123, then R = 12321 or R = 123321. Thus we can iterate through these all these digits. Also each possibility can have either odd or even number of digits in R.
Thus we iterate through each i upto 105 and create the associated palindrome R, and check whether R2 is a palindrome.
Also we will handle the odd and even palindromes separately, and break whenever out palindrome goes beyond R.
Now since , and and (on Concatenation), where i is reverse of i (in both ways), so our LIMIT will not be greater than .
Below is the implementation of above approach:

## C++

 // C++ implementation of the   // above approach  #include    using namespace std;     // check if a number is a palindrome  bool ispalindrome(int x)  {      int ans = 0;      int temp = x;      while (temp > 0)      {          ans = 10 * ans + temp % 10;          temp = temp / 10;      }      return ans == x;  }     // Function to return required count   // of palindromes  int SuperPalindromes(int L, int R)  {      // Range [L, R]         // Upper limit      int LIMIT = 100000;         int ans = 0;         // count odd length palindromes      for (int i = 0 ;i < LIMIT; i++)      {          string s = to_string(i); // if s = '1234'             string rs = s.substr(0, s.size() - 1);          reverse(rs.begin(), rs.end());             // then, t = '1234321'          string p = s + rs;           int p_sq     = pow(stoi(p), 2);          if (p_sq > R)              break;          if (p_sq >= L and ispalindrome(p_sq))              ans = ans + 1;      }         // count even length palindromes      for (int i = 0 ;i < LIMIT; i++)      {          string s = to_string(i); // if s = '1234'             string rs = s;          reverse(rs.begin(), rs.end());          string p = s + rs; // then, t = '12344321'          int p_sq = pow(stoi(p), 2);          if (p_sq > R)              break;          if (p_sq >= L and ispalindrome(p_sq))              ans = ans + 1;      }         // Return count of super-palindromes      return ans;  }     // Driver Code  int main()  {      string L = "4";      string R = "1000";             // function call to get required answer      printf("%d\n", SuperPalindromes(stoi(L),                                     stoi(R)));      return 0;  }      // This code is contributed   // by Harshit Saini

## Java

 // Java implementation of the  // above approach  import java.lang.*;     class GFG  {     // check if a number is a palindrome  public static boolean ispalindrome(int x)  {      int ans = 0;      int temp = x;      while (temp > 0)      {          ans = 10 * ans + temp % 10;          temp = temp / 10;      }      return ans == x;  }     // Function to return required   // count of palindromes  public static int SuperPalindromes(int L,                                      int R)  {      // Range [L, R]         // Upper limit      int LIMIT = 100000;         int ans = 0;         // count odd length palindromes      for (int i = 0 ;i < LIMIT; i++)      {             // if s = '1234'          String s = Integer.toString(i);             StringBuilder rs = new StringBuilder();          rs.append(s.substring(0,                       Math.max(1, s.length() - 1)));          String srs = rs.reverse().toString();             // then, t = '1234321'          String p = s + srs;          int p_sq = (int)(Math.pow(                           Integer.parseInt(p), 2));          if (p_sq > R)          {              break;          }          if (p_sq >= L && ispalindrome(p_sq))          {              ans = ans + 1;          }      }         // count even length palindromes      for (int i = 0 ;i < LIMIT; i++)      {             // if s = '1234'          String s = Integer.toString(i);              StringBuilder rs = new StringBuilder();          rs.append(s);          rs = rs.reverse();             String p = s + rs; // then, t = '12344321'          int p_sq = (int)(Math.pow(                           Integer.parseInt(p), 2));          if (p_sq > R)          {              break;          }          if (p_sq >= L && ispalindrome(p_sq))          {              ans = ans + 1;          }      }         // Return count of super-palindromes      return ans;  }     // Driver program  public static void main(String [] args)  {      String L = "4";      String R = "1000";         // function call to get required answer      System.out.println(SuperPalindromes(         Integer.parseInt(L), Integer.parseInt(R)));  }  }     // This code is contributed   // by Harshit Saini

## Python3

 # Python implementation of the above approach     # check if a number is a palindrome  def ispalindrome(x):      ans, temp = 0, x      while temp > 0:          ans = 10 * ans + temp % 10         temp = temp // 10     return ans == x     # Function to return required count of palindromes  def SuperPalindromes(L, R):      # Range [L, R]      L, R = int(L), int(R)         # Upper limit      LIMIT = 100000        ans = 0        # count odd length palindromes      for i in range(LIMIT):          s = str(i)  # if s = '1234'          p = s + s[-2::-1]  # then, t = '1234321'          p_sq = int(p) ** 2         if p_sq > R:              break         if p_sq >= L and ispalindrome(p_sq):              ans = ans + 1        # count even length palindromes      for i in range(LIMIT):          s = str(i)  # if s = '1234'          p = s + s[::-1]  # then, t = '12344321'          p_sq = int(p) ** 2         if p_sq > R:              break         if p_sq >= L and ispalindrome(p_sq):              ans = ans + 1        # Return count of super-palindromes      return ans     # Driver program  L = "4" R = "1000"    # function call to get required answer  print(SuperPalindromes(L, R))     # This code is written by  # Sanjit_Prasad

## C#

 // C# implementation of the   // above approach  using System;     class GFG  {     // check if a number is a palindrome  static bool ispalindrome(int x)  {      int ans = 0;      int temp = x;      while (temp > 0)      {          ans = 10 * ans + temp % 10;          temp = temp / 10;      }      return ans == x;  }     // utility function used for   // reversing a string  static string Reverse( string s )  {      char[] charArray = s.ToCharArray();      Array.Reverse( charArray );      return new string( charArray );  }     // Function to return required   // count of palindromes  static int SuperPalindromes(int L, int R)  {      // Range [L, R]         // Upper limit      int LIMIT = 100000;         int ans = 0;         // count odd length palindromes      for (int i = 0 ;i < LIMIT; i++)      {             // if s = '1234'          string s = i.ToString();             string rs = s.Substring(0,                         Math.Max(1, s.Length - 1));          rs = Reverse(rs);             // then, t = '1234321'          string p = s + rs;          int p_sq = (int)(Math.Pow(                              Int32.Parse(p), 2));          if (p_sq > R)          {              break;          }          if (p_sq >= L && ispalindrome(p_sq))          {              ans = ans + 1;          }      }         // count even length palindromes      for (int i = 0 ;i < LIMIT; i++)      {             // if s = '1234'          string s = i.ToString();             string rs = Reverse(s);             string p = s + rs; // then, t = '12344321'          int p_sq = (int)(Math.Pow(                              Int32.Parse(p), 2));          if (p_sq > R)          {              break;          }          if (p_sq >= L && ispalindrome(p_sq))          {              ans = ans + 1;          }      }         // Return count of super-palindromes      return ans;  }     // Driver Code  public static void Main()  {      string L = "4";      String R = "1000";         // function call to get required answer      Console.WriteLine(SuperPalindromes(              Int32.Parse(L), Int32.Parse(R)));  }  }     // This code is contributed   // by Harshit Saini

## PHP

  0)      {               $ans = (10 * $ans) +                 ($temp % 10);   $temp = (int)($temp / 10);   }     return $ans == $x;  }    // Function to return required  // count of palindromes  function SuperPalindromes($L, $R)  {   // Range [L, R]   $L = (int)$L;   $R = (int)$R;     // Upper limit   $LIMIT = 100000;         $ans = 0;     // count odd length palindromes   for($i = 0 ;$i < $LIMIT; $i++)   {     $s = (string)$i; // if s = '1234'   $rs = substr($s, 0, strlen($s) - 1);          $p = $s.strrev($rs); // then, t = '1234321'   $p_sq = (int)$p ** 2;   if ($p_sq > $R)   {   break;   }   if ($p_sq >= $L and ispalindrome($p_sq))          {              $ans = $ans + 1;          }      }          // count even length palindromes      for($i = 0 ;$i < $LIMIT; $i++)      {          $s = (string)$i; // if s = '1234'          $p = $s.strrev($s); // then, t = '12344321'     $p_sq = (int)$p ** 2;     if ($p_sq > $R)   {   break;   }   if ($p_sq >= $L and ispalindrome($p_sq))          {              $ans = $ans + 1;          }      }         // Return count of super-palindromes      return $ans;  }      // Driver Code  $L = "4";  $R = "1000";    // function call to get required answer  echo SuperPalindromes($L, \$R);     // This code is contributed   // by Harshit Saini   ?>

Output:

4

Time Complexity: O(N*log(N)) where N is upper limit and the log(N) term comes from checking if a candidate is palindrome.

My Personal Notes arrow_drop_up