Cho số nguyên n, tìm palindrome lớn nhất có thể tạo được từ tích của hai số có n chữ số. Kết quả lấy modulo 1337.
Ví dụ
Với n = 2: palindrome lớn nhất là 9009 = 99 × 91. Kết quả: 9009 % 1337 = 987.
Thuật toán
Thay vì duyệt tất cả cặp số (quá chậm), ta sinh các palindrome theo thứ tự giảm dần và kiểm tra xem có thể phân tích thành tích của hai số n chữ số hay không.
- Xác định phạm vi:
maxVal = 10^n - 1,minVal = maxVal / 10. - Duyệt
htừmaxValxuốngminVal + 1:- Tạo palindrome
xbằng cách gắn ngượchvào cuốih(ví dụ:h = 91→x = 9119). - Kiểm tra xem
xcó chia hết cho sốinào trong khoảng[maxVal, minVal]sao cho thương cũng trong khoảng đó. - Nếu tìm thấy, trả về
x % 1337.
- Tạo palindrome
- Nếu không tìm thấy (trường hợp
n = 1), trả về 9.
Cài đặt C++
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int largestPalindrome(int n) {
int maxVal = pow(10, n) - 1;
int minVal = maxVal / 10;
for (int h = maxVal; h > minVal; h--) {
lli left = h;
lli right = 0;
for (lli i = h; i > 0; right = right * 10 + i % 10, left *= 10, i /= 10);
lli x = left + right;
for (int i = maxVal; i > minVal; i--) {
if (i < x / i) break;
if (x % i == 0) return x % 1337;
}
}
return 9;
}
};
int main() {
Solution ob;
cout << ob.largestPalindrome(3);
return 0;
}
Độ phức tạp
- Thời gian: ~
O(10^n)trong trường hợp xấu, nhưng thực tế dừng sớm nhờ break khii < x/i. - Không gian:
O(1).
Input / Output
Input: 3 Output: 123