トップページに戻る
次の増井さんの書籍の問題へ
前の増井さんの書籍の問題へ
Q39 隣り合うと消えちゃうんです
C#のソース
using System;
class Program
{
static void Main()
{
for (decimal N = 3; N <= 11; N++) {
Console.WriteLine("N={0}での解は{1}", N, Solve(N));
}
}
// 包除原理で解く
static decimal Solve(decimal pN)
{
// 全事象
decimal PatternCnt = DeriveKaijyou(pN * 2);
for (decimal I = 1; I <= pN; I++) {
PatternCnt /= 2;
}
decimal WasyuugouCnt = 0;
// n(A∪B∪C∪ ・・・ ) の値を求める
for (int I = 1; I <= pN; I++) {
// 符号
int SignVal = (I % 2 == 0 ? -1 : 1);
// nCi を求める
decimal CombiCnt = DeriveCombi(pN, I);
// 各場合の数を計算
decimal wkCnt = DeriveKaijyou(pN * 2 - I);
for (decimal J = 1; J <= pN - I; J++) {
wkCnt /= 2;
}
WasyuugouCnt += SignVal * CombiCnt * wkCnt;
}
PatternCnt -= WasyuugouCnt;
PatternCnt /= DeriveKaijyou(pN);
return PatternCnt;
}
// nCrを求める
static decimal DeriveCombi(decimal pN, decimal pR)
{
decimal WillReturn = 1;
for (decimal I = pN; pN - pR + 1 <= I; I--) {
WillReturn *= I;
}
for (decimal I = 2; I <= pR; I++) {
WillReturn /= I;
}
return WillReturn;
}
// 階乗を求める
static decimal DeriveKaijyou(decimal pTarget)
{
decimal WillReturn = 1;
for (decimal I = 2; I <= pTarget; I++) {
WillReturn *= I;
}
return WillReturn;
}
}
実行結果
N=3での解は5
N=4での解は36
N=5での解は329
N=6での解は3655
N=7での解は47844
N=8での解は721315
N=9での解は12310199
N=10での解は234615096
N=11での解は4939227215
解説
緑、青、黄の3色で考察します。
緑が隣接する配置の集合をA
青が隣接する配置の集合をB
黄が隣接する配置の集合をC
とおくと
N(A∪B∪C) = N(A)+N(B)+N(C)-N(A∩B)-N(A∩C)-N(B∩C)+N(A∩B∩C)
= 3*5!/(2!*2!)
- 3*4!/2!
+ 3!
= 60
となります。
全事象は、同じものを含む順列の公式より
6!/(2!*2!*2!) = 90
余事象を考えると
90 - 60 = 30
色を区別しないので
30/3!=5
和集合の要素数は、包除原理を使って求めることができます。