Hello coders! let's suppose we have three numbers n,k,mod=1e9+7 where n,k<=1e9 how to calculate nCk %mod! any hint please! Thanks^__^
# | User | Rating |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3831 |
3 | Radewoosh | 3646 |
4 | jqdai0815 | 3620 |
4 | Benq | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | gamegame | 3386 |
10 | ksun48 | 3373 |
# | User | Contrib. |
---|---|---|
1 | cry | 164 |
1 | maomao90 | 164 |
3 | Um_nik | 163 |
4 | atcoder_official | 160 |
5 | -is-this-fft- | 158 |
6 | awoo | 157 |
7 | adamant | 156 |
8 | TheScrasse | 154 |
8 | nor | 154 |
10 | Dominater069 | 153 |
Hello coders! let's suppose we have three numbers n,k,mod=1e9+7 where n,k<=1e9 how to calculate nCk %mod! any hint please! Thanks^__^
Name |
---|
You can calculate N! in
O(log(N))
using Matrix Multiplication, then calculateN! / [ K! * (N — K)! ] % mod
How ? (only when mod is prime)thanks but how to calculate N! in log(n)?
If you can calculate n! in O(log(n)) then you have solved prime checking in O(log3(n)) or something. See this.
so we can calculate n! % mod only using linear solution?
See this. The main idea is sqrt decomposition and Lagrange interpolation. The complexity is .
Thank you so much :)
Doesn't Wilson's theorem give a $$$\mathcal{O}(\log n)$$$ time primality check in that case?
lol no, how you can calculate (p — 1)! % p in log(n)?
The comment I was replying to said " If you could compute $$$n!$$$ in $$$\mathcal{O}(\log n)$$$ you'd have a $$$\mathcal{O}(\log^3 n)$$$ primality check". Note that no claim is made that there is a $$$\mathcal{O}(\log n)$$$ algorithm for computing the factorial.
sorry for carelessness
Another approach is precalculate 106!, (2·106)!, ..., 109! locally and paste it in your code. Then you can easily calculate every factorial using 106 multiplications.
Way 1: Precalculate the factorials. Then, use Fermat's Little theorem, which says that says that $$$a^{-1} \equiv a^{p - 2} \pmod{p}$$$. This allows us to sort of transform modular division into modulo multiplication and then some powers. The pre-computing factorial is $$$O(n)$$$, dealing with the denominator is $$$O(\log(N))$$$ if you use fast exponentiation.
Way 2: Pascal's Identity. Straight forward dynamic programming. This is $$$O(n^2)$$$.
Optimization: Use Lucas's theorem.
I think you didn't realize that $$$n = 10^9$$$ which makes pre computing of factorials $$$O(n)$$$ is impossible within time and memory limit
I was speaking generally, which is why I included Way 2, which is clearly too slow. I think with Lucas's theorem, Way 1 would be sufficiently fast, though.
How would you optimize it using Lucas's theorem?
You can calculate C(n,k) = n! * reverse((n — k)!) * reverse(k!) which reverse(a) = power(a, mod — 2)
If you have enough memory, you can save first a! into an array