これ一つで階乗、階乗の逆元、ならし$O(1)$の逆元、組み合わせ($nCr$, $nPr$, $nHr$)のすべてが求められるライブラリです。 配列の確保更新は倍々に自動で行うので、不要です。
T.fact(n:int):T
$n!$の値を計算します。
計算量
T.rfact(n:int):T
T.invfact(n:int):T
$n!$の逆元の値を計算します。
計算量
T.inv(n:int):T
$n$の逆元の値を計算します。返り値はT(1) / T(n)
あるいはT(n).inv()
と同じですが、例えばTがmodintの場合前者はならし$O(1)$で計算できるのに対して、後者は毎回$O(log n)$かかります。$n$が小さくてたくさん呼ぶときなどは前者が便利です。
計算量
順列、組み合わせを$O(n)$のサイズの配列を作ることで実現します。 atcoderの時間・領域のリミットを考えると$n$は$10^7$以下程度が限界です。それより大きい場合は下記の大きい数の場合をご検討ください。 $C, H, R$の定義は高校の教科書などを参考にしてください。
T.P(n, r:int):T
$nPr$の値を$T$型で計算します。
計算量
T.C(n, r:int):T
$nCr$の値を$T$型で計算します。
計算量
T.H(n, r:int):T
$nHr$の値を$T$型で計算します。
計算量
上記と同じですが、$n$が大きい数の場合に$O(r)$かけて計算することができます。 「大きい数」の目安は長さ$n$の配列が作れない、つまり$10^7$以上程度です。
T.P_large(n, r:int):T
$nPr$の値を$T$型で計算します。
計算量
T.C_large(n, r:int):T
$nCr$の値を$T$型で計算します。
計算量
T.H_large(n, r:int):T
$nHr$の値を$T$型で計算します。
計算量
T.resetCombination()
確保した配列を一度リセットします。dynamic modintなどでmodを変えた場合に一度リセットしてください。 リセットせず前のmodでの計算結果をベースに呼び出した場合の動作は未定義です。