1. 程式人生 > >P1207 [USACO1.2]雙重回文數 Dual Palindromes

P1207 [USACO1.2]雙重回文數 Dual Palindromes

題目描述

如果一個數從左往右讀和從右往左讀都是一樣,那麼這個數就叫做“迴文數”。例如,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--;
 	     }
 	 	 
	  }
 }