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)

using System;
using System.Collections.Generic;

namespace AOJ.Volume1
{
    public class Period
    {
        public static void Main()
        {
            while (true)
            {
                string input = Console.ReadLine();
                if (string.IsNullOrEmpty(input)) { break; }

                var nums = input.Split(' ');
                long p = long.Parse(nums[0]);
                long q = long.Parse(nums[1]);

                string ans = "";
                int pos = 0;
                bool rotate = true;

                // 余りと桁を保存するDictionary
                // Key：余り
                // Value：小数点以下の位置
                var mod_list = new Dictionary<long, int>();
                mod_list.Add(p, 0);

                p = p * 10;
                // 割り算
                while (true)
                {
                    if (mod_list.ContainsKey(p))
                    {
                        pos = mod_list[p];
                        break;
                    }

                    // p > qとなるまで0を出力
                    while (p < q)
                    {
                        ans += "0";
                        p = p * 10;
                        pos++;
                    }
                    // p / q で商と余りを計算
                    long quot = p / q;
                    long mod = p % q;
                    ans += quot.ToString();
                    pos++;

                    if (mod == 0)
                    {
                        rotate = false;
                        break;
                    }
                    else
                    {
                        // 既に出現している余りの場合は循環する
                        if (mod_list.ContainsKey(mod))
                        {
                            pos = mod_list[mod];
                            break;
                        }

                        // 次のループの準備
                        mod_list.Add(mod, pos);
                        p = mod * 10;
                    }
                }
                if (rotate)
                {
                    Console.WriteLine(ans);
                    string r = new string(' ', pos);
                    r = r.PadRight(ans.Length, '^');
                    Console.WriteLine(r);
                }
                else
                {
                    Console.WriteLine(ans);
                }
            }
        }
    }
}