|
> No.1979[元記事へ]
> 問題
> nは自然数とする。
> 1が1個、2が2個、3が3個、… 、nがn個とすると、全部でn(n+1)/2個の数がある。
> これらすべてを横一列に並べるとき、同じ数が隣り合わないように並べる。
> このような並べ方は何通りあるか。
答え
連なりが0以外も、(n-1)から求めてみる。
n=3で、連なりが1の場合、
表
N\L 0 1 2 3 4 ← 連なりの個数
1: 1
2: 1 2 (0) (0) (0)
└─┼─┴─┴─┘-(N-1)から+Nまで
3: 10 26
212のとき、①2②1③2④なので、3,33を挿入する。C(4,1)C(3,1)=12通り
122のとき、①1②22③なので、3個の3を挿入する。C(3,3)=1通り
①1②232③なので、2個の3を挿入する。C(3,2)=3通り
①1②2332③なので、1個の3を挿入する。C(3,1)=3通り
計 7通り
よって、12+7*2=26通り
n=3で、連なりが2の場合、
表
N\L 0 1 2 3 4 5 ← 連なりの個数
1: 1
2: 1 2 (0) (0) (0) (0)
└─┴─┼─┴─┴─┘-(N-1)から+Nまで
3: 10 26 18
212のとき、①2②1③2④なので、333を挿入する。C(4,1)=4通り
122のとき、①1②22③なので、3,33を挿入する。C(3,1)C(2,1)=6通り
①1②23332③なので、1通り
計 7通り
よって、4+7*2=18通り
n=3で、連なりが3の場合、
表
N\L 0 1 2 3 4 5 6 ← 連なりの個数
1: 1
2: 1 2 (0) (0) (0) (0) (0)
└─┴─┼─┴─┴─┘-(N-1)から+Nまで
3: 10 26 18 6
122のとき、①1②22③なので、333を挿入する。C(3,1)=3通り
よって、3*2=6通り
(プログラムの算出方法)
n=3で、連なりが1の場合、
212のとき、①2②1③2④なので、C(0,0)C(4,2)RepComb(2,1)=12通り
122のとき、①1②2○2③なので、
C(1,0)C(3,3)RepComb(3,0)=1通り
C(1,1)C(3,1)RepComb(2,1)=6通り
計 7通り
よって、12+7*2=26通り
OPTION ARITHMETIC RATIONAL !多桁整数
DEF ReptComb(N,K)=COMB(N+K-1,K) !重複組合せ(repeated combination、nHk)
LET N=20
DIM A(0 TO (N-1)*N/2) !表 N\L
MAT A=ZER
LET A(0)=1 !N=1のとき
DIM B(0 TO (N-1)*N/2) !新しい表 N\L
!dを増やしたり減らしたりする個数を表すとして、
!連なりをm個から(m+d)個にする並べ方を考える。
!
!今、挿入するi個の△がある。具体的には、i個の数字iである。
!1から(i-1)までの数(総数s個)の並びで、
! _●_●_ … _●_○_○_○_ … _○_ (s+1)個の挿入箇所はアンダーバーで表す
! └ k個 ┘
!連なりがk個の状態とする。
!ここで、連なりをm個除去しておいて、(m+d)個にする並べ方を考える。
!・連なっている箇所kからm箇所選んで数字を入れる。 0≦m≦k とする。
!・連なっていない箇所(s+1-k)からmm箇所選んで数字を入れる。
! ただし、残りが(m+d)個になるようにmmを調整する。i-(m+mm)=m+dより、mm=i-d-2*m となる。
! _●△●△ … ●_○△○△○_ … _○_ 残り(m+d)個の△
! └ m個の△ ┘ └ mm個の△ ┘
!・挿入した(m+mm)箇所に、残り(m+d)個の数字を重複的に追加する。
! _●▲▲▲●▲▲ … ●_○▲▲▲○▲▲○_ … _○_
! └ m箇所に△を追加 ┘ └ mm箇所に△を追加 ┘
!以上の手順で実現できる。
!
!よって、
! a[i,j]=Σ[k=0,s[i-1]]Σ[m=0,k]C(k,m)*C(s[i]+1-k,mm)*H(m+mm,m+d)*a[i-1,k]
! ここで、s[i]=(i-1)*i/2, d=j-k, 0≦m≦k, mm=i-d-2*m とする。
! ただし、mm≧0かつm+d≧0で和をとる。
!とする漸化式で求まる。
LET S=0
FOR i=2 TO N !i行((i-1)番目からi番目を生成する)
MAT B=ZER
LET S0=S !a[k]の存在する範囲
LET S=(i-1)*i/2
FOR j=0 TO S !j列(連なりの個数)
LET T=0
FOR K=MAX(0,j-(i-1)) TO MIN(j+i,S0) !※実際は、(j-(i-1))から(j+i)までの範囲でよい
LET D=j-K !増減
LET W=0 !場合の数
FOR M=0 TO K
LET MM=i-D-2*M
IF MM>=0 AND M+D>=0 THEN
LET W=W+COMB(K,M)*COMB(S+1-K,MM)*ReptComb(M+MM,M+D)
!!!PRINT "C(";STR$(K);",";STR$(M);")"; !debug
!!!PRINT " C(";STR$(S+1-K);",";STR$(MM);")"; !debug
!!!PRINT " ReptComb(";STR$(M+MM);",";STR$(M+D);")"; !debug
!!!PRINT " =";COMB(K,M)*COMB(S+1-K,MM)*ReptComb(M+MM,M+D) !debug
END IF
NEXT M
LET T=T+W*A(K) !累計
!!!PRINT "A[";STR$(i-1);",";STR$(K);"] ="; A(K) !debug
NEXT K
LET B(j)=T !求める値
!!!PRINT "→ A[";STR$(i);",";STR$(j);"] ="; T !debug
NEXT j
MAT A=B !copy it
!!!PRINT !debug
NEXT i
!!!MAT PRINT A; !結果を表示する
PRINT A(0) !結果を表示する
END
表
N\L 0 1 2 3 4 5 6 7 8 9 10 ← 連なりの個数
1: 1
2: 1 2
3: 10 26 18 6
4: 1074 3366 4170 2730 1020 216 24
5: 1637124 6175296 10226280 9877440 6217680 2686656 815304 174000 25500 2400 120
|
|