Problem:
問題名

今 n 枚の数字が書かれたカードがあります。これらの一部または全部を適当に並べて数字を作ることを考えます。この時作られる数字を全て足した数を求めて下さい。

例えば、 1 と 2 があったら、作られる数字は 1, 2, 12, 21 の 4 つなので、全て足した数は 36 になります。並べた結果同じ数字が出来ても違う並べ方だとしたら別々に足します。たとえば、 1 というカードと 11 というカードがあったら並べて 111 になる並べ方が2通りありますがそれぞれ別のものとして足し合わせます。カードの中にリーディングゼロのカードはありませんし、リーディングゼロになる数字は認めません。答えを1,000,000,007 で割ったものを出力してください。

Input

入力は、以下の形で与えられます。

n
a1
a2
...
an

最初の 1 行にはカードの枚数を表す n（1 ≤ n ≤ 200）、次の n 行にはそれぞれのカードに書かれている数字 ai (0 ≤ ai < 10000) が書かれています。また複数のカードに同じ数字が書かれていることはありません。

Output

作ることの出来る全ての数字の合計を 1,000,000,007 で割ったものを 1 行に出力しなさい。

Sample Input 1

2
1
2

Output for the Sample Input 1

36

サンプルにあった例です。

Sample Input 2

2
1
11

Output for the Sample Input 2

234

作られる数字は 1 と 11 と、 111 が 2 通り作られるので全て足して 234 となります。

Sample Input 3

4
0
4
7
8

Output for the Sample Input 3

135299

04 や 078 といった並べ方は認められないことに注意してください。

Solution in JAVA (judge verdict: Time Limit Exceeded)

import java.io.IOException;
import java.math.BigInteger;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
    
public class Main {
    public static void main(String[] args) throws IOException {
        (new Main()).execute();
    }
    private BigInteger sum = new BigInteger("0");
    private void execute() {
        Scanner sc = new Scanner(System.in);
        summary(new StringBuilder(), getArray(sc), new HashSet<String>());
        System.out.println(sum.divideAndRemainder(new BigInteger("1000000007"))[1]);
        sc.close();
    }
    
    private void summary(StringBuilder sb, String[] arr, Set<String> usedSet) {
    	if(usedSet.size() == arr.length) {return;}
    	for(int i = 0 ; i < arr.length ; i++) {
    		if(usedSet.isEmpty() && "0".equals(arr[i])){continue;}

    		if(!usedSet.contains(arr[i])) {
    			usedSet.add(arr[i]);
    			sb.append(arr[i]);
    			sum = sum.add(new BigInteger(sb.toString()));
    			summary(sb, arr, usedSet);
    			sb.delete(sb.length() - arr[i].length(), sb.length());
    			usedSet.remove(arr[i]);
    		}
    	}
    }

    private String[] getArray(Scanner sc) {
    	String[] result = new String[sc.nextInt()];
    	for(int i = 0 ; i < result.length ; i++) {
    		result[i] = sc.next();
    	}
    	return result;
    }
}