Largest Palindrome Product

hard math

Problem

Find the largest palindrome made from the product of two n-digit numbers, modulo 1337.

Inputn = 2
Output987
987 = 99 × 91 (mod 1337 = 987).

def largest_palindrome(n):
    if n == 1: return 9
    upper = 10**n - 1
    lower = 10**(n - 1)
    for left in range(upper, lower - 1, -1):
        s = str(left)
        palindrome = int(s + s[::-1])
        x = upper
        while x * x >= palindrome:
            if palindrome % x == 0:
                return palindrome % 1337
            x -= 1
    return -1
function largestPalindrome(n) {
  if (n === 1) return 9;
  const upper = 10 ** n - 1;
  const lower = 10 ** (n - 1);
  for (let left = upper; left >= lower; left--) {
    const s = String(left);
    const palindrome = BigInt(s + s.split("").reverse().join(""));
    let x = BigInt(upper);
    while (x * x >= palindrome) {
      if (palindrome % x === 0n) return Number(palindrome % 1337n);
      x--;
    }
  }
  return -1;
}
class Solution {
    public int largestPalindrome(int n) {
        if (n == 1) return 9;
        long upper = (long) Math.pow(10, n) - 1;
        long lower = (long) Math.pow(10, n - 1);
        for (long left = upper; left >= lower; left--) {
            String s = String.valueOf(left);
            long palindrome = Long.parseLong(s + new StringBuilder(s).reverse());
            for (long x = upper; x * x >= palindrome; x--) {
                if (palindrome % x == 0) return (int) (palindrome % 1337);
            }
        }
        return -1;
    }
}
int largestPalindrome(int n) {
    if (n == 1) return 9;
    long upper = (long) pow(10, n) - 1;
    long lower = (long) pow(10, n - 1);
    for (long left = upper; left >= lower; left--) {
        string s = to_string(left);
        string r = s; reverse(r.begin(), r.end());
        long palindrome = stol(s + r);
        for (long x = upper; x * x >= palindrome; x--) {
            if (palindrome % x == 0) return (int) (palindrome % 1337);
        }
    }
    return -1;
}
Time: O(100^n) Space: O(1)