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 Ruby (judge verdict: Accepted)

module Memoizable
	def memoize(name)
		original = "__original_#{name}__"
		([Class, Module].include?(self.class) ? self : self.class).class_eval {
			alias_method(original, name)
			private(original)
			cache = {}
			define_method(name){|*args|
				cache[args] ||= send(original, *args)
			}
		}
	end 
end
include Memoizable

MOD = 1_000_000_007

def fact(n)
	return 1 if n == 0
	n * fact(n-1)
end

def all_perm(n)
	return 1 if n == 0
	1 + (0..n-1).map {|k| fact(n) / fact(k)}.inject(:+)
end

$save = {}
def f(sizes, k)
	h = { [0, 0] => 1 }
	sizes.reverse.each.with_index do |s, i|
		new_h = Hash.new(0)
		h.each do |(k, l), c|
			new_h[[k, l]] += c
			new_h[[k+1, l+s]] += c
		end
		h = new_h
		$save[k] = Marshal.load(Marshal.dump(h)) if i == sizes.size - 2
	end

	s = 0
	h.each do |(k, l), c|
		s += (10 ** l) * c * fact(k) * all_perm(sizes.size - k)
	end
	s
end

memoize :fact
memoize :all_perm
memoize :f

n = gets.to_i
cards = (1..n).map { gets.to_i }.sort
sum = 0

size_count = Hash.new(0)
sum_per_size = Hash.new(0)
cards.each do |x|
	k = x.to_s.size
	size_count[k] += 1
	sum_per_size[k] += x
end

(1..4).each do |i|
	sizes = (1..4).map {|j| [j] * [size_count[j] - (j == i ? 1 : 0), 0].max}.flatten
	sum += sum_per_size[i] * f(sizes, i)
end

if cards[0] > 0 || n == 1
	puts sum % MOD
	exit
end

n -= 1
(1..4).each do |i|
	next if size_count[i] == 0
	($save[i] || []).each do |(k, l), c|
		sum -= (sum_per_size[i] * 10 ** l) * c * fact(k) * all_perm(n - 1 - k)
	end
end

puts sum % MOD