m
mが任意の整数(通常は大きな素数として選択される)である、モジュロを法とする順列の総数を計算する方法は、次のプロパティを使用することであると主張します。
(a * b) % m = ((a % m) * (b % m)) % m
Nの順列の総数がであると考えると、N! = 1 * 2 * 3 * .. * N
を計算する必要がある場合は、N! % m
基本的に上記のプロパティをmを法とする乗算に適用できます。
((((1 * (2 % m)) % m) * (3 % m)) % m) * ..
編集
90を計算するために!/(10!^ 9)値係数を単純化してから、mを法とする乗算を使用してmを法とする最終結果を計算できます。
これが私が考えていることです:
90!= 10!*(11 * 12 * .. * 20)*(21 * 22 * .. * 30)* .. *(81 * 82 * .. * 90)
その後、元の式を次のように書き直すことができます。
(10!*(11 * 12 * .. * 20)*(21 * 22 * .. * 30)* .. *(81 * 82 * .. * 90))/(10!* 10!*。。 。*10!)
分子には、9つの因子の積があります。括弧内の各式を因子と見なします。分母についても同じことが言えます(9つの要素があり、それぞれが10に相当します!)。
分母の最初の要素は、単純化するのは簡単です。その後も、単純化が必要な8つのペアがあります。
したがって、製品の各項を因数分解して、分母を単純化することができます。例えば:
11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 <=> 11 * 2 * 2 * 3 * 13 * 2 * 7 * 3 * 5 * 2 * 2 * 2 * 2 * 17 * 2 * 9 * 2 * 2 * 5
分母は常に次のようになります:2 * 3 * 2 * 2 * 5 * 2 * 3 * 7 * 2 * 2 * 2 * 2 * 3 * 3 * 2 * 5
簡略化後、2番目のペアは次のようになります:2 * 2 * 11 * 13 * 17 * 19
同じことが後続の各ペアにも適用でき、上記の式を使用してmを法として計算できる単純な積になります。
もちろん、単純化を実行するためのアルゴリズムを効率的に実装するのは難しいので、最終的には、今私が理解できないより良い方法がなければなりません。