このディレクトリの索引

#  
#  分割数
#  n個の互いに区別できない品物を、m個以下に分割する方法の総和を求め、
#  Mで割ったあまりを答えなさい。
#  

n個の互いに区別できない品物を、m個以下に分割する方法の総和を求め、Mで割ったあまりを答えなさい。(_n,_m,_分割数,_Mで割ったあまり) :-
        分割数(_n,_m,_分割数,_Mで割ったあまり).

分割数(_n,_m,_分割数,_Mで割ったあまり) :-
        nCr(_n,_m,_総和),
        _Mで割ったあまり is _総和 mod _m.

nCr(N,R,X) :-
        U is N - R + 1,
        階乗(U,N,K1),
        階乗(R,K2),
        X is K1 // K2.

階乗(M,N,1) :-
        M > N,!.
階乗(M,N,X) :-
        M2 is M + 1,
        階乗(M2,N,Y),
        X is M * Y.

階乗(0,1) :- !.
階乗(1,1) :- !.
階乗(N,X) :-
        N2 is N - 1,
        階乗(N2,Y),
        X is N * Y.