https://www.luogu.org/problem/P1015
题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数5656,将5656加6565(即把5656从右向左读),得到121121是一个回文数。
又如:对于十进制数8787:
STEP1:8787+7878 = 165165
STEP2:165165+561561 = 726726
STEP3:726726+627627 = 13531353
STEP4:13531353+35313531 = 48844884
在这里的一步是指进行了一次NN进制的加法,上例最少用了44步得到回文数48844884。
写一个程序,给定一个NN(2 \le N \le 10,N=162≤N≤10,N=16)进制数MM(100100位之内),求最少经过几步可以得到回文数。如果在3030步以内(包含3030步)不可能得到回文数,则输出Impossible!
输入格式
两行,分别是NN,MM。
输出格式
STEP=ans
思路:模拟。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1005;
int n,len;
int a[maxn],b[maxn];
char s[maxn];
void cal()
{
for(int i=1;i<=len;i++)
b[i]=a[i];
for(int i=1;i<=len;i++)
a[i]+=b[len-i+1];
for(int i=1;i<=len;i++)
{
a[i+1]+=a[i]/n;
a[i]%=n;
}
++len;
while(a[len])
{
a[len+1]+=a[len]/n;
a[len]%=n;
++len;
}
--len;
}
bool check()
{
int t=len/2;
for(int i=1;i<=t;i++)
if(a[i]!=a[len-i+1])
return 0;
return 1;
}
int main()
{
scanf("%d",&n);
scanf("%s",s+1);
len=strlen(s+1);
for(int i=1;i<=len;i++)
{
char ch=s[len-i+1];
if(ch>='0'&&ch<='9')
a[i]=ch-'0';
else
a[i]=ch-'A'+10;
}
int times=0;
while(++times<=30)
{
cal();
if(check())
break;
}
if(times>30)
printf("Impossible!\n");
else
printf("STEP=%d\n",times);
return 0;
}