AT274の技術だったりなかったり

あっとのTECH LOG

競プロのこととか技術のこととか。たまに日常を書きます。

ABC127 E - Cell Distance

問題原文

atcoder.jp

問題要旨

 H × W のグリッドがある。このグリッドに区別のつかない  K 個のコマを、各マスにつき最大1つ配置する。
また K 個のコマの、ある配置の仕方についてのコストを、  \sum_{i=1}^{K-1}\sum_{j=i+1}^{K}(|h_i - h_j| + |w_i - w_j|) と定める。
全ての配置の仕方についてのコストの総和を求めよ。ただし配置が異なるとは、片方の配置ではコマがあるが、もう一方にはないようなものをいう。

  •   1 \leq H × W \leq 2×10^{5}
  •  1 \leq K \leq H × W

解法

いくつかのステップに分かれてます。

  1. 制約が完全に罠   1 \leq H,  W \leq 2×10^{5} ではないので気をつけましょう。いや罠すぎる。

  2.  H W を分けて考える
    こういうのは  H W について分けて考えるのがおすすめです。最後にそれぞれのコストの総和を足し合わせればよいです。
    ここからは  W、つまり横方向についてのみ考えていきます。

  3. とりあえずある行にコマを2個おいてみる
    とりあえずおいてみます。

    f:id:AT274:20200220214223p:plain
    とりあえずおいてみる

    黄色マスがコマを配置すると決めたところです。この2つのマス間の距離は3ですが、これは何回数えられるでしょうか?
    答えは、  W マスからすでに2マス使っていて、加えて  K コマからすでに2つ使っているので、  {}_{W - 2}C_{K - 2} 通りになります。
    でも実際には縦に  H 行分グリッドが続くので、  {}_{H×W - 2}C_{K - 2} 通りになります。

  4. マス間の距離が  d になるようなものは何通りあるか?
    「ある2つのマスを決めた時に、そのコストが何回カウントされるか」はわかりましたが、まだ間に合いません。
    二つのマス間の距離が同じであるならば、それらはまとめて計算できるので、今度は「マス間の距離が  d になるようなものは何通りあるか?」を考えていきます。
    これは、ある1行に着目した場合には  (W - d) 個になります。( d 個先にマスが存在するようなものは、  W - dマス目までしかありません)
    でもこれも3と同じように、縦に  H 行分グリッドが続くのでそれらを考慮してやる必要があります。
    実際には、必ずしも同じ行に2コマを配置する必要がないので2行の選び方が  H^{2} 通りになって、結局マス間の距離が  d になるようなものは、 (W - d)×H^{2} 個あります。これらの計算を各  d について行っても、  0\ leq d \leq W - 1 なので、十分間に合います。

これで、  W についてのコストの総和を求めることができました。同じように  H についても計算して、足し合わせたものが答えになります。

実装

逆元コンビネーションは準備しておいてください。

H, W, K = map(int, input().split())
MOD = 10 ** 9 + 7

ans = 0
# Hについて
for d in range(1, H):
    ans += d * (H - d) * pow(W, 2, MOD) * nCr(H * W - 2, K - 2) % MOD
    ans %= MOD
# Wについて
for d in range(1, W):
    ans += d * (W - d) * pow(H, 2, MOD) * nCr(H * W - 2, K - 2) % MOD
    ans %= MOD

print(ans % MOD)

感想

HとWを分けて考える というのはとても大事なとっかかりですね。
あとは丁寧に考察を積み上げれば解ける、解いてて楽しい問題だと思います。
ただし制約、テメーはダメだ。