Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- long long MOD = 1e9+7;
- long long fast_pow(long long a, int p)
- {
- if(p == 0) return 1;
- long long half = fast_pow(a, p/2);
- if(p%2 == 0) return half * half % MOD;
- return a * half % MOD * half % MOD;
- }
- struct matrix
- {
- int n,m;
- vector<vector<long long>> arr;
- matrix(int n)
- {
- this->n = this->m = n;
- arr.assign(n, vector<long long>(m));
- }
- matrix(int n, int m)
- {
- this->n = n; this->m = m;
- arr.assign(n, vector<long long>(m));
- }
- matrix(vector<vector<long long>>& arr)
- {
- this->arr = arr;
- n = arr.size();
- m = arr[0].size();
- }
- vector<long long>& operator [](int i)
- {
- return arr[i];
- }
- };
- matrix ident(int n)
- {
- matrix I(n);
- for(int i=0;i<n;i++) I[i][i] = 1;
- return I;
- }
- matrix mmult(matrix& A, matrix& B)
- {
- matrix C(A.n, B.m);
- 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;}
- return C;
- }
- matrix mpow(matrix& A, long long p)
- {
- if(p==0) return ident(A.n);
- matrix half = mpow(A, p/2);
- matrix res = mmult(half, half);
- if(p&1) return mmult(A, res);
- return res;
- }
- vector<long long> fact(3e5);
- void comp_fact()
- {
- fact[0] = 1;
- for(int i=1;i<fact.size();i++)
- fact[i] = i * fact[i-1] % MOD;
- }
- long long inverse_mod(int n){ return fast_pow(n, MOD - 2); }
- long long C(int n, int k)
- {
- if(k > n) return 0;
- return fact[n] * inverse_mod(fact[k]) % MOD * inverse_mod(fact[n - k]) % MOD;
- }
Advertisement
Add Comment
Please, Sign In to add comment