トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Problem85 長方形の数え上げ
問題
注意深く数えると, 横が3, 縦が2の長方形の格子には, 18個の長方形が含まれている.
ぴったり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通り
以上のことをふまえて、
場合の数の積の法則と、等差数列の和の公式を使ってます。