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: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();

            string input;

            while (!string.IsNullOrEmpty(input = Console.ReadLine()))
            {
                string[] temp = input.Split(' ');
                int p = int.Parse(temp[0]);
                int q = int.Parse(temp[1]);

                List<int> xs = new List<int>();
                List<int> ys = new List<int>();

                int n = 0, m = 0, pos = 0;

                while (true)
                {
                    n = p / q;
                    m = p % q;

                    if (m == 0)
                    {
                        ys.Add(n);
                        break;
                    }

                    pos = -1;

                    for (int i = 0; i < xs.Count; i++)
                    {
                        if (xs[i] == m)
                        {
                            pos = i;
                            break;
                        }
                    }

                    if (pos >= 0)
                    {
                        ys.Add(n);
                        break;
                    }

                    xs.Add(m);
                    ys.Add(n);

                    p = m * 10;
                }

                if (pos == -1)
                {
                    for (int i = 1; i < ys.Count; i++)
                    {
                        sb.Append(ys[i]);
                    }
                    sb.Append("\n");
                }
                else
                {
                    for (int i = 1; i < ys.Count; i++)
                    {
                        sb.Append(ys[i]);
                    }
                    sb.Append("\n");

                    for (int i = 0; i < ys.Count - 1; i++)
                    {
                        if (i < pos) sb.Append(" ");
                        else sb.Append("^");
                    }
                    sb.Append("\n");
                }
            }
            Console.Write(sb);
        }
    }
}