解決済みの質問
数え上げの難問
数え上げの難問
こんにちは。
Yahoo知恵袋において正答の得られないまま解決済みとなっている問題で、
興味深い数え上げの問題をみつけました。
この問題です。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1410342774
ここに問題文を書いておきます。
-----------------------------------------
(問題)
35文字のアルファベット
A,A,
B,B,B,B,B,
C,C,C,C,C,C,C,
D,D,D,D,D,D,D,D,
E,E,E,E,E,E,E,E,E,E,E,E,E
を、同じ文字が隣り合わないように一列に並べる方法は全部で何通りありますか。
------------------------------------------
かなり面倒な問題です。
与えられた35文字のアルファベットを一列に並べる方法は
35!/(2!*5!*7!*8!*13!) = 34024365132790032000 通り あります。
この値から同じ文字が隣り合っているようなものを引けば答えが得られるはずですが、
複雑すぎて私には手に負えません。
どなたかこの問題を解けた方、解法と答えを教えてください。
-
- 質問日時:
- 2010/2/9 12:18:24
-
- 解決日時:
- 2010/2/11 17:05:46
-
- 回答数:
- 2
-
- 閲覧数:
- 304
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
nxgtelkさん
二項係数 mCn を C(m,n) と書くことにします.
この問題は, 包含と排除の原理を使えば立式は容易です.
計算式と答えは,
Σ[a=0~1]Σ[b=0~4]Σ[c=0~6]Σ[d=0~7]Σ[e=0~12](-1)^(a+b+c+d+e)*C(1,a)*C(4,b)*C(6,c)*C(7,d)*C(12,e)*(35-a-b-c-d-e)!/((2-a)!(5-b)!(7-c)!(8-d)!(13-e)!)
=1646842861654056 通り.
また, 漸化式を作って計算する方法もあります。
indcpaさんの漸化式を使って, プログラムを組んで計算してみました.
以下は, フリーソフト Risa/Asir 使って計算したときのプログラムと出力結果です.
最終的に,
A[2][5][7][8][13]+B[2][5][7][8][13]+C[2][5][7][8][13]+D[2][5][7][8][13]+E[2][5][7][8][13]
の値を出力するプログラムです.
プログラム:
def min(A,B){if(A<=B) return A; else return B;}$
def max(A,B){if(A<=B) return B; else return A;}$
A=newvect(3)$
B=newvect(3)$
C=newvect(3)$
D=newvect(3)$
E=newvect(3)$
for(I=0;I<=2;I++){
A[I]=newvect(6);
B[I]=newvect(6);
C[I]=newvect(6);
D[I]=newvect(6);
E[I]=newvect(6);}
for(I=0;I<=2;I++){
for(J=0;J<=5;J++){
A[I][J]=newvect(8);
B[I][J]=newvect(8);
C[I][J]=newvect(8);
D[I][J]=newvect(8);
E[I][J]=newvect(8);}}
for(I=0;I<=2;I++){
for(J=0;J<=5;J++){
for(K=0;K<=7;K++){
A[I][J][K]=newvect(9);
B[I][J][K]=newvect(9);
C[I][J][K]=newvect(9);
D[I][J][K]=newvect(9);
E[I][J][K]=newvect(9);}}}
for(I=0;I<=2;I++){
for(J=0;J<=5;J++){
for(K=0;K<=7;K++){
for(L=0;L<=8;L++){
A[I][J][K][L]=newvect(14);
B[I][J][K][L]=newvect(14);
C[I][J][K][L]=newvect(14);
D[I][J][K][L]=newvect(14);
E[I][J][K][L]=newvect(14);}}}}
A[1][0][0][0][0]=1$
B[0][1][0][0][0]=1$
C[0][0][1][0][0]=1$
D[0][0][0][1][0]=1$
E[0][0][0][0][1]=1$
for(N=2;N<=35;N++){
for(I=max(N-33,0);I<=min(N,2);I++){
for(J=max(N-I-28,0);J<=min(N-I,5);J++){
for(K=max(N-I-J-21,0);K<=min(N-I-J,7);K++){
for(L=max(N-I-J-K-13,0);L<=min(N-I-J-K,8);L++){
M=N-I-J-K-L;
if(I>0){A[I][J][K][L][M]=B[I-1][J][K][L][M]+C[I-1][J][K][L][M]+D[I-1][J][K][L][M]+E[I-1][J][K][L][M];}
if(J>0){B[I][J][K][L][M]=A[I][J-1][K][L][M]+C[I][J-1][K][L][M]+D[I][J-1][K][L][M]+E[I][J-1][K][L][M];}
if(K>0){C[I][J][K][L][M]=A[I][J][K-1][L][M]+B[I][J][K-1][L][M]+D[I][J][K-1][L][M]+E[I][J][K-1][L][M];}
if(L>0){D[I][J][K][L][M]=A[I][J][K][L-1][M]+B[I][J][K][L-1][M]+C[I][J][K][L-1][M]+E[I][J][K][L-1][M];}
if(M>0){E[I][J][K][L][M]=A[I][J][K][L][M-1]+B[I][J][K][L][M-1]+C[I][J][K][L][M-1]+D[I][J][K][L][M-1];}
}}}}}
A[2][5][7][8][13]+B[2][5][7][8][13]+C[2][5][7][8][13]+D[2][5][7][8][13]+E[2][5][7][8][13];
出力結果:1646842861654056
- 違反報告
- 回答日時:2010/2/10 13:27:58
- この質問・回答は役に立ちましたか?
- 役に立った!
お役立ち度:
0人が役に立つと評価しています。
ベストアンサー以外の回答
(1件中1〜1件)
indcpaさん
答えだしてないのに書き込んですみません.
もし少しでも参考になればいいと思うので書き込みます.
多分人手では厳しいです.
賢いやり方があって私が気付いていないということも十分ありえますが.
以下のようにして漸化式を用いてコンピュータにやらせることはできると思います.
Aがi個,Bがj個,Cがk個,Dがl個,Eがm個の時に
条件を満たす並べ方のうち,Aで終わるものの場合の数をA(i,j,k,l,m)
,Bで終わるものの場合の数をB(i,j,k,l,m)
,Cで終わるものの場合の数をC(i,j,k,l,m)
,Dで終わるものの場合の数をD(i,j,k,l,m)
,Eで終わるものの場合の数をE(i,j,k,l,m)
とします.
たとえばA(i,j,k,l,m)は最後がBで終わるもの,Cで終わるもの,Dで終わるもの,Eで終わるものに
Aをくっつけたものなので下のような漸化式が成り立ちます.
A(i,j,k,l,m)=B(i-1,j,k,l,m)+C(i-1,j,k,l,m)+D(i-1,j,k,l,m)+E(i-1,j,k,l,m),
他も同様です.
B(i,j,k,l,m)=A(i,j-1,k,l,m)+C(i,j-1,k,l,m)+D(i,j-1,k,l,m)+E(i,j-1,k,l,m),
C(i,j,k,l,m)=A(i,j,k-1,l,m)+B(i,j,k-1,l,m)+D(i,j,k-1,l,m)+E(i,j,k-1,l,m),
D(i,j,k,l,m)=A(i,j,k,l-1,m)+B(i,j,k,l-1,m)+C(i,j,k,l-1,m)+E(i,j,k,l-1,m),
E(i,j,k,l,m)=A(i,j,k,l,m-1)+B(i,j,k,l,m-1)+C(i,j,k,l,m-1)+D(i,j,k,l,m-1),
i+j+k+l+mが小さいところから順番に計算していけば求まります.
状態数はiが3通り,jが6通り,kが9通り,,lが9通り,mが13通りで,ABCDEの5種類があり
3*6*9*9*13*5=10万程度なのでプログラムを組めば多分10秒もかからずに
答えが出ると思います.
プログラム組む気力はないので答えはないです.すみません.
あと間違ってたらすみません.
[補足]
>nxgtelkさん
計算結果を出してくださり,ありがとうございます.
- 違反報告
- 編集日時:2010/2/10 22:29:15
- 回答日時:2010/2/10 02:31:40


質問した人からのコメント
1646842861654056通りですか。
やはり簡単にはもとまらないようですね。