Official

C - 整理券 Editorial by sounansya


\(K=N\) の場合は答えは \(N!\) 通りです。以降は \(K < N\) である場合を考えます。

各ファンが順番通りに会場に入るためには以下の条件を満たす必要があります。

  • 自分より番号が大きく自分より到着順が早い人が \(K\) 人以下である。

逆に、 \(N\) 人全員のファンに対して上の条件が満たされていれば順番通りにファンを案内することができます。

このようなファンの到着順は、ファンを番号の大きい順に考えることで \(K!(K+1)^{N-K}\) 通りであることが分かります。(番号の大きい \(K\) 人のファンは順番を気にする必要はないが、それ以降の \(N-K\) 人のファンは自分より前にいる人が \(K\) 人以下であるような \(K+1\) 箇所のどこかに入る必要がある)

以上を適切に実装することでこの問題に正答することができます。計算量は \(O(N)\) です。

実装例(Python3)

n, k = map(int, input().split())
mod = 998244353
if n == k:
  ans = 1
  for i in range(n):
    ans *= i + 1
    ans %= mod
  print(ans)
  exit()
ans = 1
for i in range(k + 1):
    ans *= i + 1
    ans %= mod
ans *= pow(k + 1, n - k - 1, mod)
print(ans % mod)

posted:
last update: