比赛描述
Openxxx发现,我们所熟知十进制、二进制、十六进制都是一类很特殊的进制,其实进制有着更一般的情况。Openxxx发明了一种进制表示的通项公式:K~(a1,a2,……,ak-1,ak), 其中K代表进制的循环节长度,向量 (a1,a2,……,ak-1,ak) 是对循环节的描述。比如我们所熟知的十进制,二进制,十六进制可依次表示为 1~(10),1~(2)和1~(16),他们都属于循环节长度为1的进制。如果长度大于1会怎么样?不妨让我们观察一下进制2~(10,2)从0开始计数的情况:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,100?
为什么不是20呢?因为在此进制下第2位的位权是2,所以第2位上应该逢2进1。第3位呢?我们可以循环利用前面的位权,第3位就和第1位一样逢10进1,第4位就和第2位一样逢2进1,如此循环下去……
现在的问题是:给你两种不同的进制,请将原进制下的数转换成目标进制下的数。为了方便数的表达,我们用大写字母’A’~’Z’来代替10~35。
输入
多组测试数据,每组数据第1行输入两个正整数K1、K2,分别描述原进制和目标进制的循环节长度;第2行输入一串长度不超过30的字串(仅由 ’0’~’9’ 和’A’~’Z’ 构成),即原进制下的数。数据保证是合法的;第3行输入K1个正整数a1 ,…,ak1,第4行输入K2个正整数b1,…,bk2,分别描述原进制和目标进制的循环节。(1≤K1, K2≤10;2≤所有a, b≤36;0≤待转换的数≤2^30) 输入直至文件结尾。
输出
每组数据输出仅一行:转换后的目标数。
样例输入
1 1
8
10
2
2 2
ABC
16 15
14 13
样例输出
1000
102C
提示
题目来源
openxxx
/* Wrong Answer at Test 1 #include<iostream> #define N 32 int ow[N]; //original weight原操作数对应的权重 int on[N]; //original number原操作数 int tw[N]; //target weight目的操作数对位的权重 int tn[N]; //target number目的操作数 char temp[N]; //存放接收到的数据 int tempW[N]; //每一位的权重 //字符转化为数字,c[0]表示最高位,n[0]表示个位 void charToNum(char *c,int *n,int len){ int i; for(i=0;i<len;i++){ if(c[i]>='0' && c[i]<='9'){ n[len-1-i] = c[i]-'0'; }else{ n[len-1-i] = c[i]-'A'+10; } } } void numToChar(int *n,char *c,int len){ int i; for(i=0;i<len;i++){ if(n[i]<10){ c[len-1-i] = n[i]+'0'; }else{ c[len-1-i] = n[i]-10+'A'; } } c[len] = 0; } int main(){ // freopen("test.txt","r",stdin); int K1,K2,i,oLen,tLen,r; while(scanf("%d%d",&K1,&K2)==2){ scanf("%s",temp); oLen = strlen(temp); //原操作数的长度 charToNum(temp,on,oLen); for(i=0;i<K1;i++){ scanf("%d",&tempW[i]); } ow[0] = 1; for(i=1;i<N;i++){ //会溢出,先不管 ow[i] = ow[i-1]*tempW[(i-1)%K1]; } // for(i=0;i<N;i++){ // printf("%d\n",ow[i]); // } for(i=0;i<K2;i++){ scanf("%d",&tempW[i]); } tw[0] = 1; for(i=1;i<N;i++){ tw[i] = tw[i-1]*tempW[(i-1)%K2]; } // for(i=0;i<N;i++){ // printf("%d\n",tw[i]); // } r = 0; for(i=0;i<oLen;i++){ r += on[i]*ow[i]; } if(r==0){ printf("0\n"); } for(tLen=0;r>=tw[tLen];tLen++); tLen; for(i=tLen-1;i>=0;i--){ tn[i] = r/tw[i]; r %= tw[i]; } numToChar(tn,temp,tLen); printf("%s\n",temp); } } */ /* Presentation Error at Test 1 #include<iostream> #define N 40 __int64 ow[N]; //original weight原操作数对应的权重 __int64 on[N]; //original number原操作数 __int64 tw[N]; //target weight目的操作数对位的权重 __int64 tn[N]; //target number目的操作数 char temp[N]; //存放接收到的数据 __int64 tempW[N]; //每一位的权重 //字符转化为数字,c[0]表示最高位,n[0]表示个位 void charToNum(char *c,__int64 *n,__int64 len){ __int64 i; for(i=0;i<len;i++){ if(c[i]>='0' && c[i]<='9'){ n[len-1-i] = c[i]-'0'; }else{ n[len-1-i] = c[i]-'A'+10; } } } void numToChar(__int64 *n,char *c,__int64 len){ __int64 i; for(i=0;i<len;i++){ if(n[i]<10){ c[len-1-i] = n[i]+'0'; }else{ c[len-1-i] = n[i]-10+'A'; } } c[len] = 0; } int main(){ // freopen("test.txt","r",stdin); __int64 K1,K2,i,oLen,tLen,r; while(scanf("%I64d%I64d",&K1,&K2)==2){ scanf("%s",temp); oLen = strlen(temp); //原操作数的长度 charToNum(temp,on,oLen); for(i=0;i<K1;i++){ scanf("%I64d",&tempW[i]); } ow[0] = 1; for(i=1;i<N;i++){ //会溢出,先不管 ow[i] = ow[i-1]*tempW[(i-1)%K1]; } // for(i=0;i<N;i++){ // printf("%d\n",ow[i]); // } for(i=0;i<K2;i++){ scanf("%I64d",&tempW[i]); } tw[0] = 1; for(i=1;i<N;i++){ tw[i] = tw[i-1]*tempW[(i-1)%K2]; } // for(i=0;i<N;i++){ // printf("%d\n",tw[i]); // } r = 0; for(i=0;i<oLen;i++){ r += on[i]*ow[i]; } if(r==0){ printf("0\n"); } for(tLen=0;r>=tw[tLen];tLen++); tLen; for(i=tLen-1;i>=0;i--){ tn[i] = r/tw[i]; r %= tw[i]; } numToChar(tn,temp,tLen); printf("%s\n",temp); } } */ #include<iostream> #define N 40 __int64 ow[N]; //original weight原操作数对应的权重 __int64 on[N]; //original number原操作数 __int64 tw[N]; //target weight目的操作数对位的权重 __int64 tn[N]; //target number目的操作数 char temp[N]; //存放接收到的数据 __int64 tempW[N]; //每一位的权重 //字符转化为数字,c[0]表示最高位,n[0]表示个位 void charToNum(char *c,__int64 *n,__int64 len){ __int64 i; for(i=0;i<len;i++){ if(c[i]>='0' && c[i]<='9'){ n[len-1-i] = c[i]-'0'; }else{ n[len-1-i] = c[i]-'A'+10; } } } void numToChar(__int64 *n,char *c,__int64 len){ __int64 i; for(i=0;i<len;i++){ if(n[i]<10){ c[len-1-i] = n[i]+'0'; }else{ c[len-1-i] = n[i]-10+'A'; } } c[len] = 0; } int main(){ // freopen("test.txt","r",stdin); __int64 K1,K2,i,oLen,tLen,r; while(scanf("%I64d%I64d",&K1,&K2)==2){ scanf("%s",temp); oLen = strlen(temp); //原操作数的长度 charToNum(temp,on,oLen); for(i=0;i<K1;i++){ scanf("%I64d",&tempW[i]); } ow[0] = 1; for(i=1;i<N;i++){ //会溢出,先不管 ow[i] = ow[i-1]*tempW[(i-1)%K1]; } // for(i=0;i<N;i++){ // printf("%d\n",ow[i]); // } for(i=0;i<K2;i++){ scanf("%I64d",&tempW[i]); } tw[0] = 1; for(i=1;i<N;i++){ tw[i] = tw[i-1]*tempW[(i-1)%K2]; } // for(i=0;i<N;i++){ // printf("%d\n",tw[i]); // } r = 0; for(i=0;i<oLen;i++){ r += on[i]*ow[i]; } if(r==0){ printf("0\n"); continue; //PE1 } for(tLen=0;r>=tw[tLen];tLen++); tLen; for(i=tLen-1;i>=0;i--){ tn[i] = r/tw[i]; r %= tw[i]; } numToChar(tn,temp,tLen); printf("%s\n",temp); } }