[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<bits/stdc++.h>
int n,a[1000010],b[100010],i,l1,l2;
using namespace std;
int hw(void){
for (int i=1;i<=l1/2;i++)
if (a[i]!=a[l1-i+1])
return 0;
return 1;
}
int pd(int k){
l1=0;
do{
a[++l1]=k%n;
k/=n;
}
while(k!=0);
return 0;
}
int pd2(int k){
l2=0;
do{
b[++l2]=k%n;
k/=n;
}
while(k!=0);
return 0;
}
int main(){
scanf("%d",&n);
for(i=1;i<=300;i++){
int k=i*i;
pd(k);
if (hw()){
k=i;
pd2(k);
for(int l=l2;l>0;l--)
if(b[l]>=10) printf("%c",b[l]+'A'-10);
else printf("%d",b[l]);
printf(" ");
for (int l=l1;l>0;l--)
if(a[l]>=10) printf("%c",a[l]+'A'-10);
else printf("%d",a[l]);
printf("\n");
}
}
return 0;
}