Problem:
塵劫記

大きな数を表そうとすると、文字数も多くなるし、位取りがわからなくなってしまうので、なかなか面倒です。大きな数をわかりやすく表すために、人々は数の単位を使ってきました。江戸時代に書かれた「塵劫記」という本の中では、数の単位が次のように書かれています。

たとえば、２の１００乗のようなとても大きな数は、１２６穣７６５０(じょ)６００２垓２８２２京９４０１兆４９６７億３２０万５３７６と表せます。それでは、正の整数 m と n が与えられたとき、m の n 乗を塵劫記の単位を使って上のように表すプログラムを作成してください。

入力

入力は複数のデータセットからなる。入力の終わりはゼロ２つの行で示される。各データセットは以下の形式で与えられる。

m n

m (2 ≤ m ≤ 20) が基数、n (1 ≤ n < 240) が指数を表す。ただし、mnは 1072 未満である。

データセットの数は 100 を超えない。

出力

データセットごとに、mn を塵劫記の単位で表した文字列を1行に出力する。ただし、各単位は以下の表記で出力する。

mnを表す文字列は、1 から 9999 までの数と上の表に現れる単位を表す文字列からなる。文字列には、余分な 0 や単位を含めない。

入出力例

入力例

2 10
5 20
10 8
20 17
0 0

出力例

1024
95Cho3674Oku3164Man625
1Oku
131Gai720Kei

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
import java.math.*;

class Main{
  public static void main(String args[]){

    BigInteger n, m, tmp1, tmp2;
    tmp1 = new BigInteger(String.valueOf(10000));
    tmp2 = new BigInteger(String.valueOf(0));
    Scanner sc = new Scanner(System.in);
    int a, b;

    String t[] = {"", "Man", "Oku", "Cho", "Kei", "Gai", "Jo", "Jou", "Ko", "Kan",
      "Sei", "Sai", "Gok", "Ggs", "Asg", "Nyt", "Fks", "Mts"};

    while(true){
      a = Integer.parseInt(sc.next());
      b = Integer.parseInt(sc.next());
      if(a == 0) break;

      n = new BigInteger(String.valueOf(a));
      n = n.pow(b);

      String ans = "";
      int p = 0;

      while(!n.equals(tmp2)){
        m = n.remainder(tmp1);
        long temp = m.longValue();
        if(temp != 0){
          ans = String.valueOf(temp) + t[p] + ans;
        }
        n = n.divide(tmp1);
        p++;
      }

      System.out.println(ans);
    }
  }
}