@@ -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