Skip to content

Commit 01571c4

Browse files
authored
Update Combination-Number.cpp
1 parent cd9df76 commit 01571c4

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

Template/Math/Combination-Number.cpp

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,31 +61,31 @@ LL comb(LL m, LL n)
6161

6262
/*********************************/
6363
// Version 4: Compute C(m,n) on demand with module M
64-
long long quickMul(long long x, long long N)
64+
const LL MOD = 1e9 + 7;
65+
vector<LL> factorial;
66+
vector<LL> GetFactorial(LL N)
6567
{
66-
if (N <= 0) {
68+
vector<LL>rets(N+1);
69+
rets[0] = 1;
70+
for (int i=1; i<=N; i++)
71+
rets[i] = rets[i-1] * i % MOD;
72+
return rets;
73+
}
74+
75+
long long quickPow(long long x, long long N) {
76+
if (N == 0) {
6777
return 1;
6878
}
69-
LL y = quickMul(x, N / 2) % MOD;
79+
LL y = quickPow(x, N / 2) % MOD;
7080
return N % 2 == 0 ? (y * y % MOD) : (y * y % MOD * x % MOD);
7181
}
72-
73-
void precompute(int n, vector<long long>& fact, vector<long long>& inv_fact)
74-
{
75-
fact[0] = inv_fact[0] = 1;
76-
for (int i = 1; i <= n; ++i)
77-
{
78-
fact[i] = fact[i - 1] * i % MOD;
79-
}
80-
inv_fact[n] = quickMul(fact[n], MOD - 2);
81-
for (int i = n - 1; i >= 1; --i)
82-
{
83-
inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD;
84-
}
85-
}
8682

87-
long long comb(int n, int k, const vector<long long>& fact, const vector<long long>& inv_fact)
83+
LL comb(LL m, LL n)
8884
{
89-
if (k > n || k < 0) return 0;
90-
return fact[n] * inv_fact[k] % MOD * inv_fact[n - k] % MOD;
85+
if (n>m) return 0;
86+
LL a = factorial[m];
87+
LL b = factorial[n] * factorial[m-n] % MOD;
88+
LL inv_b = quickPow(b, (MOD-2));
89+
90+
return a * inv_b % MOD;
9191
}

0 commit comments

Comments
 (0)