Problem:
循環小数

2 つの正の整数 p, q を入力し、 p / q を小数として正確に表現することを考えます。(ただし、0 < p < q < 106とします。)

このとき、結果は

有限の桁で正確に表現できる。

ある桁の範囲を繰り返す循環小数となる。

のいずれかとなります。筆算と同じ手順で1桁ずつ小数部を求めていくと、

割り切れた(余りが 0 になった)なら、そこまでの桁で正確に表現できた。

1度出てきた余りが、再び現れたなら、循環した。

と区別できます。

2 つの整数 p, q を入力すると、 p / q を小数で表した時の、小数部を出力するプログラムを作成してください。 ただし、

結果が有限の桁で正確に表現できる時は、数値だけを 1 行に出力してください。

結果が循環小数になる時は次のように 2 行に出力してください。

最初の行に、循環する部分までの数字を出力してください。

次の行には、循環しない部分の下には空白を出力し、循環する部分の下には「^」を出力してください。

いずれの場合も数字列は 80 文字を超えることはないものとします。

Input

入力は複数のデータセットからなります。各データセットとして、p, q が空白区切りで１行に与えられます。データセットの数は 250 を超えません。

Output

データセットごとに、循環しない小数の場合は数値の小数部分を(この場合 1 行)、循環小数の場合は循環するまでの数字と循環する部分を示す記号「^」(この場合 2 行) を出力してください。

Sample Input

1 12
10000 32768
1 11100
1 459550

Output for the Sample Input

083
^
30517578125
00009
^^^
00000217604178
^^^^^^^^^^^^

Solution in C (judge verdict: Wrong Answer)

#include <stdio.h>
#include <string.h>

int main(void)
{
    int i, j, ct;
    int p, q;
    static int mod[1000000], n[100], w[10000000];
    
    while (scanf("%d%d", &p, &q) != EOF){
        
        memset(mod, -1, sizeof(mod));
        memset(n, -1, sizeof(n));
        memset(w, -1, sizeof(p));
        
        p *= 10;
        w[p] = 1;
        i = ct = 0;
        while (mod[0] == -1) {
            if (mod[p % q] != -1){
                if (w[p] != p / q){
                    printf("%d", p / q);
                    n[i++] = p % q;
                }
                else {
                    ct = 1;
                }
                break;
            }
            printf("%d", p / q);
            mod[p % q] = n[i++] = p % q;
            w[p] = p / q;
            p = (p % q) * 10;
        }
        printf("\n");
        if (mod[0] == -1){
            for (j = 0; j < i; j++){
                printf("%c", (n[j] == p % q && ct) ? '^' : ' ');
                if (n[j] == p % q){
                    ct = 1;
                    n[j + 1] = p % q;
                }
            }
            printf("\n");
        }
    }
    
    return (0);
}