| 123456789101112131415161718192021222324252627282930313233343536373839 | func largestPalindrome(n int) int {	// mod 1337	if n == 1 {		return 9	}	upper := int(math.Pow10(n)) - 1	lower := upper / 10	for i := upper; lower < i; i-- {		pa := toPalindrome(i)		bound := int(math.Sqrt(float64(pa)))		for j := upper; j >= bound; j-- {			if pa%j != 0 {				continue			}			if ratio := pa / j; lower < ratio && ratio <= upper {				return pa % 1337			}		}	}	return -1 // Not found}func toPalindrome(x int) (res int) {	num := make([]int, 64)	lo, hi := 0, 0	for ; x != 0; x /= 10 {		num[lo] = x % 10		lo++	}	copy(num[lo:], num[:lo])	for hi, lo = lo, lo-1; 0 <= lo; lo, hi = lo-1, hi+1 {		num[lo] = num[hi]	}	for i, base := 0, 1; i < hi; i, base = i+1, base*10 {		res += num[i] * base	}	return}
 |