找大於 S 的前 N 個整數,使其在 2~10 進制中至少有兩種為回文數。N≤15, S≤10000。
S+1 開始枚舉整數 i。i,檢查進制 2~10 的表示是否為回文。N 個合格數。void toBase(int num, int base) {
int idx = 0;
while (num / base) {
s[idx++] = "0123456789ABCDEF"[num % base];
num /= base;
}
s[idx++] = "0123456789ABCDEF"[num % base];
s[idx] = '\0';
}
bool isPalindrome() {
int len = strlen(s);
if (s[0] == '0' && s[len-1] == '0') return false; // 排除前導零情況
for (int i = 0; i <= len/2; i++)
if (s[i] != s[len-1-i]) return false;
return true;
}
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
char s[100];
int N, S;
int main() {
freopen("dualpal.in", "r", stdin);
freopen("dualpal.out", "w", stdout);
scanf("%d %d", &N, &S);
int found = 0;
for (int i = S+1; ; i++) {
int palCount = 0;
for (int b = 2; b <= 10; b++) {
if (palCount >= 2) break;
toBase(i, b);
if (isPalindrome()) palCount++;
}
if (palCount >= 2) {
printf("%d\n", i);
if (++found == N) break;
}
}
return 0;
}
"0123456789ABCDEF" 簡潔高效。1001 合法,010 非法)。freopen 處理。9 * log_base(i) 位操作。此題是進制轉換、回文判斷、暴力枚舉的基礎綜合練習,USACO 入門經典題目。