一、题目
二、解法
本篇题解将详细介绍如何进行大数进制转化(实现非常简单,不用高精度)
我们考虑从高位到低位的转化过程,如下图:
然后从小到大地去修改
b
b
b数组就行了,每个值都乘上
a
a
a,再维护一个余数(一开始是
m
m
m),进个位就行了。
#include <cstdio>
#include <cstring>
const int M = 1005;
int read()
{
int num=0,flag=1;char c;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9')num=(num<<3)+(num<<1)+(c^48),c=getchar();
return num*flag;
}
int T,A,B,a[M],b[M];char s[M];
int fuck(char c)
{
if(c>='0' && c<='9') return c-'0';
if(c>='A' && c<='Z') return c-'A'+10;
if(c>='a' && c<='z') return c-'a'+36;
}
char refuck(int c)
{
if(c>=0 && c<=9) return c+'0';
if(c>=10 && c<36) return c-10+'A';
return c-36+'a';
}
signed main()
{
T=read();
while(T--)
{
memset(b,0,sizeof b);
A=read();B=read();
scanf("%s",s+1);
a[0]=strlen(s+1);
for(int i=1;i<=a[0];i++)
a[i]=fuck(s[i]);
for(int i=1;i<=a[0];i++)
{
for(int j=1,r=a[i];j<=b[0] || r;j++)
{
b[j]=b[j]*A+r;
r=b[j]/B;
b[j]%=B;
if(j>b[0]) b[0]=j;
}
}
printf("%d %s\n%d ",A,s+1,B);
if(b[0]==0) b[0]=1;
for(int j=b[0];j>=1;j--)
printf("%c",refuck(b[j]));
puts("");puts("");
}
}