くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

Python3で解く AtCoder Regular Contest 107 B - Quadruple

まず、{\displaystyle a, b, c, d} すべてのパターンを一気に考えようとせず、{\displaystyle 1 \leq a, b \leq n}かつ{\displaystyle a + b = x}を満たす{\displaystyle a, b}の組み合わせ数を出せるようにする。その後条件を詰めていく。

結果的に、問題は{\displaystyle (a+b) - (c+d) = k}なので、{\displaystyle (a+b) = x}かつ{\displaystyle (c+d) = x-k}として考えることができる。

目次

概要

問題

  1. 整数{\displaystyle n, k}が与えられる。
  2. 4つの整数の組{\displaystyle (a, b, c, d)}であって,以下の条件を両方満たすものは何個あるか?
  3. {\displaystyle 1 \leq a, b, c, d \leq n}
  4. {\displaystyle a + b - c - d = k}

数の大きさの制約は問題を見てもらう。


解くときに考えた内容

  • 問題を{\displaystyle 1 \leq a, b, c, d \leq n}かつ{\displaystyle (a+b) - (c+d) = k}なので、{\displaystyle 1 \leq a, b, c, d \leq n}かつ{\displaystyle (a+b) = x}かつ{\displaystyle (c+d) = x-k}とまず捉える。
  • とすると、以下の条件を満たす{\displaystyle f(n, x)}を解ければ良いとわかる。

    • {\displaystyle 1 \leq a, b, c, d \leq n}かつ{\displaystyle 2 \leq x \leq 2n}
  • 例えば {\displaystyle n = 6, k = 3}のとき

    • {\displaystyle x=5}における{\displaystyle a, b}の組み合わせ数 {\displaystyle \times\ x-k = 2} における{\displaystyle c, d}の組み合わせ数({\displaystyle 4 \times 1}
    • {\displaystyle x=6}における{\displaystyle a, b}の組み合わせ数 {\displaystyle \times\  x-k = 3} における{\displaystyle c, d}の組み合わせ数({\displaystyle 5 \times 2}
    • {\displaystyle x=7}における{\displaystyle a, b}の組み合わせ数 {\displaystyle \times\  x-k = 4} における{\displaystyle c, d}の組み合わせ数({\displaystyle 6 \times 3}
    • {\displaystyle x=8}における{\displaystyle a, b}の組み合わせ数 {\displaystyle \times\  x-k = 5} における{\displaystyle c, d}の組み合わせ数({\displaystyle 5 \times 4}
    • {\displaystyle x=9}における{\displaystyle a, b}の組み合わせ数 {\displaystyle \times\  x-k = 6} における{\displaystyle c, d}の組み合わせ数({\displaystyle 4 \times 5}
    • {\displaystyle x=10}における{\displaystyle a, b}の組み合わせ数 {\displaystyle \times\  x-k = 7} における{\displaystyle c, d}の組み合わせ数({\displaystyle 3 \times 6}
    • {\displaystyle x=11}における{\displaystyle a, b}の組み合わせ数 {\displaystyle \times\  x-k = 8} における{\displaystyle c, d}の組み合わせ数({\displaystyle 2 \times 5}
    • {\displaystyle x=12}における{\displaystyle a, b}の組み合わせ数 {\displaystyle \times\  x-k = 9} における{\displaystyle c, d}の組み合わせ数({\displaystyle 1 \times 4}
      ここまで考えればよい。
  • 肝心の、{\displaystyle f(n, x)}は計算式では{\displaystyle min(k-1, 2*n - (k-1))}以下のように表せる。

    • {\displaystyle n}の制約がなければ、{\displaystyle k-1}だが、 {\displaystyle n}の制約下だと、 {\displaystyle 2*n - (k-1)}のどちらか小さい方になる。
    • また、うまく条件分岐すれば良いが、面倒なので、{\displaystyle min(k-1, 2*n - (k-1))}の値が{\displaystyle 0}以下未満になったら{\displaystyle 0}となるようにする。

コード

def a_b_x(n, k):
    # a+b=xかつ1<=a, b<=nを満たす個数
    # 数えるべき部分をif文で書くべきだが、面倒なので範囲外は0とする。
    ans = max(0, min(k-1, 2*n - (k-1)))
    return ans            
n, k = map(int, input().split())
cnt = 0
for i in range(2, 2*n+1):
    cnt += a_b_x(n, i) * a_b_x(n, i-k)
print(cnt)        

参考になる書籍

けんちょんさんこと、大槻さんの書籍である、「問題解決力を鍛える!アルゴリズムとデータ構造」 ご本人の記事の中で難易度は、螺旋本ということで初学者でも非常に結構読みやすい!!!(実際に、けんちょんさんの記事はC++に疎い自分でも、その思考プロセスを学べるくらい丁寧に書かれているし、この書籍も非常に読みやすい)どのようなステータスの人にもおすすめの一冊になっている。

問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)

問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)

  • 作者:大槻 兼資
  • 発売日: 2020/10/02
  • メディア: 単行本(ソフトカバー)

書籍は読み終わったので、Pythonで章末問題をこなしていっている。

blacktanktop.hatenablog.com