题目
[USACO1.2]回文平方数 Palindromic Squares
题目描述
回文数是指从左向右念和从右向左念都一样的数。如 12321 12321 12321 就是一个典型的回文数。
给定一个用十进制表示的正整数 B B B,输出所有 [ 1 , 300 ] [1,300] [1,300] 中,它的平方用 B B B 进制表示时是回文数的数。
输入格式
共一行,一个单独的正整数 B B B。
输出格式
每行两个 B B B 进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。
注意大于
9
9
9 的数,用字母表示。如用 A
表示
10
10
10,B
表示
11
11
11,用第
n
n
n 个大写字母表示
n
+
9
n+9
n+9。
样例 #1
样例输入 #1
10
样例输出 #1
1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696
提示
【数据范围】
对于
100
%
100\%
100% 的数据,
2
≤
B
≤
20
2 \le B \le 20
2≤B≤20
题目翻译来自NOCOW。
USACO Training Section 1.2
代码
#include<iostream>
#include<algorithm>
#include<string>
#include <cstdio>
using namespace std;
int a[302],a2[302];
int i,j,k,n,b;
void f1(int n1){
i=0;
while(n1>0){
a2[++i]=n1%b;
n1/=b;
}
while(i){
if(a2[i]<=9) cout<<a2[i];
else printf("%c", a2[i] - 10 + 'A');
i--;
}
}
void f2(int n2){
j=0;
int nn = n2*n2;
while(nn>0){
a[++j]=nn%b;
nn/=b;
}
k=j;i=j;
while(i>0&&a[i]==a[k-i+1]) i--;
if(i==0){
f1(n2);
cout<<" ";
while(k){
if(a[k]<10) cout<<a[k];
else printf("%c", a[k] - 10 + 'A');
k--;
}
cout<<endl;
}
}
int main(){
cin>>b;
for(int i=1;i<=300;i++)
f2(i);
return 0;
}