matbensch

C++ Combinatorics Template

Oct 24th, 2023
1,397
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.63 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. long long MOD = 1e9+7;
  7.  
  8. long long fast_pow(long long a, int p)
  9. {
  10.   if(p == 0) return 1;
  11.   long long half = fast_pow(a, p/2);
  12.   if(p%2 == 0) return half * half % MOD;
  13.   return a * half % MOD * half % MOD;
  14. }
  15.  
  16.  
  17. struct matrix
  18. {
  19.     int n,m;
  20.     vector<vector<long long>> arr;
  21.  
  22.     matrix(int n)
  23.     {
  24.         this->n = this->m = n;
  25.         arr.assign(n, vector<long long>(m));
  26.     }
  27.     matrix(int n, int m)
  28.     {
  29.         this->n = n; this->m = m;
  30.         arr.assign(n, vector<long long>(m));
  31.     }
  32.     matrix(vector<vector<long long>>& arr)
  33.     {
  34.         this->arr = arr;
  35.         n = arr.size();
  36.         m = arr[0].size();
  37.     }
  38.     vector<long long>& operator [](int i)
  39.     {
  40.         return arr[i];
  41.     }
  42. };
  43.  
  44. matrix ident(int n)
  45. {
  46.     matrix I(n);
  47.     for(int i=0;i<n;i++) I[i][i] = 1;
  48.     return I;
  49. }
  50.  
  51. matrix mmult(matrix& A, matrix& B)
  52. {
  53.     matrix C(A.n, B.m);
  54.     for(int i=0;i<A.n;i++) for(int j=0;j<B.m;j++) for(int k=0;k<A.m;k++) {C[i][j] += (A[i][k] * B[k][j]) % MOD; C[i][j] %= MOD;}
  55.     return C;
  56. }
  57.  
  58. matrix mpow(matrix& A, long long p)
  59. {
  60.     if(p==0) return ident(A.n);
  61.     matrix half = mpow(A, p/2);
  62.     matrix res = mmult(half, half);
  63.     if(p&1) return mmult(A, res);
  64.     return res;
  65. }
  66.  
  67. vector<long long> fact(3e5);
  68.  
  69. void comp_fact()
  70. {
  71.   fact[0] = 1;
  72.   for(int i=1;i<fact.size();i++)
  73.      fact[i] = i * fact[i-1] % MOD;
  74. }
  75.  
  76. long long inverse_mod(int n){ return  fast_pow(n, MOD - 2); }
  77.  
  78. long long C(int n, int k)
  79. {
  80.   if(k > n) return 0;
  81.   return fact[n] * inverse_mod(fact[k]) % MOD * inverse_mod(fact[n - k]) % MOD;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment