LoginSignup
0
0

More than 1 year has passed since last update.

yukicoder contest 307 参戦記

Last updated at Posted at 2021-07-31

yukicoder contest 307 参戦記

A 1628 Sorting Integers (MAX of M)

実際にN個の整数列を生成して、大きい順にソートで並び替えて、文字列として連結すればいいです.

N, *c = map(int, open(0).read().split())

t = []
for i in range(9):
    for _ in range(c[i]):
        t.append(i + 1)

print(''.join(str(i) for i in sorted(t, reverse=True)))

B 1629 Sorting Integers (SUM of M)

ある数字 a を一つ抽出して考えてみる. a は b 個存在するとする. a が1の桁の場合のパターン数は (N-1)! となる. ただし区別がつかないものは排除しないといけないので、実際には (N-1)!/b! となる. これが10の桁の場合、100の桁の場合……と繰り返すことになる. 各桁の合計は (10N-1)/9 で計算できる. またある数字 a は実際には b 個存在するので b を掛けないといけない. 結論として、ある数字 a に起因して総和に足される数は (10N-1)/9*a*(N-1)!/(b-1)! となる. 後は a を1から9に変更しながら総和を取るだけである.

m = 1000000007

N, *c = map(int, open(0).read().split())

fac = [1] * (N + 1)
for i in range(N):
    fac[i + 1] = fac[i] * (i + 1)
    fac[i + 1] %= m

x = fac[N - 1] * (pow(10, N, m) - 1) * pow(9, -1, m) % m
frac = 0
denom = 1
for i in range(9):
    if c[i] == 0:
        continue
    frac += c[i] * (i + 1) * x
    frac %= m
    denom *= pow(fac[c[i]], -1, m)
    denom %= m
print(frac * denom % m)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0