P1207 [USACO1.2]雙重回文數 Dual Palindromes
阿新 • • 發佈:2018-12-22
題目描述
如果一個數從左往右讀和從右往左讀都是一樣,那麼這個數就叫做“迴文數”。例如,12321就是一個迴文數,而77778就不是。當然,迴文數的首和尾都應是非零的,因此0220就不是迴文數。
事實上,有一些數(如21),在十進位制時不是迴文數,但在其它進位制(如二進位制時為10101)時就是迴文數。
編一個程式,從檔案讀入兩個十進位制數N (1 <= N <= 15)S (0 < S < 10000)然後找出前N個滿足大於S且在兩種或兩種以上進位制(二進位制至十進位制)上是迴文數的十進位制數,輸出到檔案上。
本問題的解決方案不需要使用大於32位的整型
輸入輸出格式
輸入格式:
只有一行,用空格隔開的兩個數N和S。
輸出格式:
N行, 每行一個滿足上述要求的數,並按從小到大的順序輸出。
輸入輸出樣例
輸入樣例#1: 複製
3 25
輸出樣例#1: 複製
26 27 28
說明
題目翻譯來自NOCOW。
USACO Training Section 1.2
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<cstring> #include<map> using namespace std; int n,kk; int m; int a[10000]; inline void change(int x,int n) { while(x!=0) { a[++kk]=x%n; x/=n; } } inline void clear(int n) { for(int i=1;i<=n;i++) a[i]=0; } inline bool check(int x) { int s=0; for(int i=2;i<=10;i++) { int m=0; clear(kk); kk=0; change(x,i); for(int j=1;j<=kk/2;j++) if(a[j]!=a[kk-j+1])m=1; if(!m)s++; if(s==2)return 1; } return 0; } int main() { scanf("%d%d",&n,&m); int k=m; while(n>0) { ++k; if(check(k)) { printf("%d\n",k); n--; } } }