Problem:
Problem C: Factorization

Problem

ukuku1333さんはおっちょこちょいなので、
x の一次式の積を展開したら、元の一次式がわからなくなってしまった。

x の n 次多項式が与えられるので、因数分解して元のxの一次式の積の形にせよ。

x の n 次多項式は以下のBNFによって与えられる。

<多項式> := <項> | <多項式>+<項> | <多項式>−<項>
<項> := x^<指数> | <係数>x^<指数> | <係数>x | <定数>
<指数> := [2-5]
<係数> := [1-9][0-9]*
<定数> := [1-9][0-9]*

指数及び係数が省略されている場合は1とみなす。

Input

入力は以下の形式で与えられる。

S

x の n 次多項式を表す文字列 S が一行に与えられる。

Constraints

入力は以下の条件を満たす。

2 ≤ n ≤ 5

与えられる式の項の数を m とすると、1 ≤ i < j ≤ m なる任意の i, j の組に対して、

i 番目の項の次数は j 番目の項の次数より大きいことが保証される

与えられるx の n 次多項式は、x の一次式の積の形に因数分解したもので表すことができることが保証される

係数、定数の絶対値はそれぞれ2×103以下である

次数が最大のものの係数は1であり、省略されていることが保証される

展開する前のそれぞれの一次式の元の定数項は0ではない整数であることが保証される

展開する前のそれぞれの一次式の元の定数項は相異なることが保証される

Output

S をx の一次式の積の形に因数分解したものを、定数項の小さいものから順に出力せよ。

出力の最後には改行を入れること。

Sample Input 1

x^2+3x+2

Sample Output 1

(x+1)(x+2)

Sample Input 2

x^2-1

Sample Output 2

(x-1)(x+1)

Sample Input 3

x^5+15x^4+85x^3+225x^2+274x+120

Sample Output 3

(x+1)(x+2)(x+3)(x+4)(x+5)

Sample Input 4

x^3-81x^2-1882x-1800

Sample Output 4

(x-100)(x+1)(x+18)

Solution in C# (judge verdict: Accepted)

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

class Program
{
    static void Main()
    {
        var s = "1" + Console.ReadLine();
        s = s.Replace("-", "+-");
        s = s.Replace("x+", "x^1+");
        s = s.Replace("+x", "+1x");
        s = s.Replace("-x", "-1x");
        var ss = s.Split('+');
        int n = int.Parse(ss[0].Replace("x^", ""));
        var keisu = new int[n + 1];
        foreach (var item in ss)
        {
            if (item.Contains("x^"))
            {
                var sss = item.Replace("x^", "#").Split('#');
                keisu[int.Parse(sss[1])] = int.Parse(sss[0]);
            }
            else
            {
                keisu[0] = int.Parse(item);
            }
        }
        var ans = new List<long>();
        for (long i = 3000; i > -3000; i--)
        {
            long sum = 0;
            long xx = 1;
            for (int j = 0; j < keisu.Length; j++)
            {
                sum += xx * keisu[j];
                xx *= i;
            }
            if (sum == 0)
                ans.Add(-i);
        }
        var ret = new StringBuilder();
        foreach (var item in ans)
        {
            ret.Append("(x+");
            ret.Append(item);
            ret.Append(")");
        }
        Console.WriteLine(ret.ToString().Replace("+-", "-"));
    }
}