トップページに戻る
   次のC#のサンプルへ
   前のC#のサンプルへ
Problem85 長方形の数え上げ
問題
注意深く数えると, 横が3, 縦が2の長方形の格子には, 18個の長方形が含まれている.
 ぴったり2000000個の長方形を含むような長方形の格子は存在しない.
一番近い解を持つような格子の面積を求めよ.
ぴったり2000000個の長方形を含むような長方形の格子は存在しない.
一番近い解を持つような格子の面積を求めよ.
ソース
using System;
class Program
{
    const long Shikii = 2000000;
    static void Main()
    {
        long AnswerDiff = int.MaxValue;
        long AnswerMenseki = int.MaxValue;
        for (int W = 1; W < int.MaxValue; W++) {
            long YokoSum = W * (W + 1) / 2;
            for (int H = W; H < int.MaxValue; H++) {
                long TateSum = H * (H + 1) / 2;
                long CurrCnt = YokoSum * TateSum;
                long CurrDiff = Math.Abs(CurrCnt - Shikii);
                if (CurrDiff < AnswerDiff) {
                    AnswerDiff = CurrDiff;
                    AnswerMenseki = W * H;
                    Console.WriteLine("{0}個の長方形を含む長方形(W={1},H={2},面積={3})を発見",
                        CurrCnt, W, H, AnswerMenseki);
                }
                if (Shikii < CurrCnt) break;
            }
            if (YokoSum * YokoSum > Shikii) break;
        }
    }
}
実行結果
省略
1997001個の長方形を含む長方形(W=1,H=1998,面積=1998)を発見
1999000個の長方形を含む長方形(W=1,H=1999,面積=1999)を発見
1999305個の長方形を含む長方形(W=2,H=1154,面積=2308)を発見
2000016個の長方形を含む長方形(W=3,H=816,面積=2448)を発見
1999998個の長方形を含む長方形(W=36,H=77,面積=2772)を発見
解説
4*3の長方形だと
内包する長方形の
横幅が4の場合、始点のXから終点のXまでの選び方は1通り
横幅が3の場合、始点のXから終点のXまでの選び方は2通り
横幅が2の場合、始点のXから終点のXまでの選び方は3通り
横幅が1の場合、始点のXから終点のXまでの選び方は4通り
内包する長方形の
縦幅が3の場合、始点のXから終点のXまでの選び方は1通り
縦幅が2の場合、始点のXから終点のXまでの選び方は2通り
縦幅が1の場合、始点のXから終点のXまでの選び方は3通り
以上のことをふまえて、
場合の数の積の法則と、等差数列の和の公式を使ってます。