HHKB プログラミングコンテスト 2020 D - Squares
2年前の問題になりますが HHKB プログラミングコンテスト 2020のD - Squaresについてです。
atcoder.jp
問題としては1辺Nの正方形のグリッド中にA(1辺a),B(1辺b)の2つの正方形を重ならないような配置の総数を求めるというもの。
解説だと余事象から求めている(全体からA,Bが重なる方法を引く)のだけれど、別解で解いたので書いておきます。
包除原理で重ならない方法を直接的に計算する方法です。
2つの正方形が重ならないためには、x軸もしくはy軸に並行に引いた線でA、Bの正方形を分離できる必要があります。
上下に分けることができる配置を、左右に分けることができる配置をとすると、 が答えです。
はA,Bが対角の位置となるように十字に線を引くことができる配置です。
上下にABの順に並ぶものを、同様に左右にABの順に並ぶものを とします。
対称性から、以下が成り立ちます。
ということで最終的に以下の値を求めます。
Bの左端をx,上端をyとするとはそれぞれ以下の式で求めることができます。
展開して整理すると以下のようになります。展開は Wolfram|Alpha: Computational Intelligence を使いました。
とするとすっきりします。