### 解题思路

[参考大佬解法](https://leetcode.com/problems/largest-palindrome-product/discuss/276101/Python3-Math-and-Non-math-solutions-with-detailed-explanation)
方法一 迭代+剪枝

### 代码

* python3

```python3
# 1迭代法
class Solution:
    def largestPalindrome(self, n: int) -> int:
        if n == 1: return 9
        hi = 10 ** n - 1  # 最大的n位数
        lo = 10 ** (n - 1)  # 最小的n位数
        maxfirst = (hi ** 2) // (10 ** n)  # 前半部分最大值
        for first in range(maxfirst, lo - 1, -1):
            palidrome = int(str(first) + str(first)[::-1])
            # 因为长度为偶数的palidrom一定能被11整除，所以我们假设其中一个的因数能被11整除，即可以进行11的步长搜索结果
            x = hi // 11 * 11  # 从高往低搜索
            for factor in range(x, lo - 1, -11):
                if palidrome % factor == 0 and lo <= palidrome // factor <= hi:d
                    return palidrome % 1337
                if palidrome // factor > hi:
                    break
```

方法二 数学法
设因数为`X,Y`,令$X,Y=10^{n}-i,10^{n}-j$,此时`i>=1,j>=1`; 设`a=i+j`; 设回文序列为`p`,并令$p=X*Y=upper*10^{n}+lower\\$
->又$p=X*Y=10^{n}*10^{n}-10^{n}*j-10^{n}*i+i*j=(10^{n}-i-j)*10^{n}+i*j=(10^n-a)*10^n+lower$,此时$upper=10^{n}-a,lower=i*j=i*(a-i)\\$
->则$(i-a/2)^{2}=0.25*a^{2}-lower\\$
又因为`i,j`均为整数，那么`2*i-a`也一定为整数，所以$\sqrt{a^{2}-4*lower}$一定为整数,那么从`a>=2`开始，找到以`upper`为前半部分,`lower`为后半部分的回文序列，再筛选符合$\sqrt{a^{2}-4*lower}$为整数的`lower`和`a`

* python3

```python3
# 2数学法
class Solution:
    def largestPalindrome(self, n: int) -> int:
        if n == 1: return 9
        a = 2
        hi = 10 ** n - 1
        lo = 10 ** (n - 1)
        while a < 2 * 10 ** n:
            upper = 10 ** n - a
            lower = int(str(upper)[::-1])
            if a ** 2 - 4 * lower >= 0 and (a ** 2 - 4 * lower) ** 0.5 == int((a ** 2 - 4 * lower)**0.5):
                num = int(str(upper)+ str(upper)[::-1])
                return num % 1337
            a += 1
```

