Alex_tz307

COMBINATORICA

Aug 16th, 2021 (edited)
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.97 KB | None | 0 0
  1. const int mod = 1e9 + 7;
  2. /// const int mod = 666013;
  3. const int MAXN = 1e5;
  4. int f[1 + MAXN], invf[1 + MAXN];
  5.  
  6. /* int64_t nck(int N, int K) { Combinari in O(N)
  7.   if (K < N - K)
  8.     K = N - K;
  9.   int64_t ans = 1;
  10.   int p = 2;
  11.   for (int i = K + 1; i <= N; ++i) {
  12.     ans *= i;
  13.     while (p <= N - K && ans % p ==0)
  14.       ans /= p++;
  15.   }
  16.   return ans;
  17. } */
  18.  
  19. int invers(int x) { /// Invers modular
  20.   int n = mod - 2;
  21.   int64_t ans = 1;
  22.   while (n) {
  23.     if (n & 1)
  24.       ans = ans * x % mod;
  25.     x = (int64_t)x * x % mod;
  26.     n >>= 1;
  27.   }
  28.   return ans;
  29. }
  30.  
  31. int nck(int n, int k) {
  32.   if (n < k)
  33.     return 0;
  34.   if (n == k)
  35.     return 1;
  36.   return (int64_t)f[n] * invf[k] % mod * invf[n - k] % mod;
  37. }
  38.  
  39. void compute_factorial() { /// IMPORTANT!!!
  40.   f[0] = f[1] = 1;
  41.   for (int i = 2; i <= MAXN; ++i)
  42.     f[i] = (int64_t)f[i - 1] * i % mod;
  43.   invf[MAXN] = invers(f[MAXN]);
  44.   for (int i = MAXN - 1; i >= 0; --i)
  45.     invf[i] = (int64_t)invf[i + 1] * (i + 1) % mod;
  46. }
Add Comment
Please, Sign In to add comment