murugappan_s

CHESGAME - Editorial

Oct 15th, 2018
569
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define ld long double
  4. #define pb push_back
  5. #define x first
  6. #define y second
  7. #define fastread ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
  8. #define PI (atan(1)*4)
  9. #define mp make_pair
  10. using namespace std;
  11.  
  12. const ll mod = 1e9 + 7;
  13. #define matrix_mod mod
  14. template<class mat_type>
  15. struct matrix {
  16.  
  17.     int n_rows, n_cols;
  18.     vector< vector<mat_type> > m;
  19.  
  20.     matrix(int r = 1, int c = 1, bool I = false) {
  21.         m.resize(r);
  22.         for (int i = 0; i < r; i++) m[i].resize(c, 0);
  23.         n_rows = r;
  24.         n_cols = c;
  25.         if (I)
  26.             make_identity();
  27.     }
  28.  
  29.     void make_identity() {
  30.         for (int i = 0; i < n_rows; i++) m[i][i] = 1;
  31.     }
  32.  
  33. #ifndef matrix_mod
  34.  
  35.     mat_type add(mat_type a, mat_type b) {
  36.         return a + b;
  37.     }
  38.  
  39.     mat_type sub(mat_type a, mat_type b) {
  40.         return a - b;
  41.     }
  42.  
  43.     mat_type mul(mat_type a, mat_type b) {
  44.         return a * b;
  45.     }
  46.  
  47. #else
  48.  
  49.     mat_type add(mat_type a, mat_type b) {
  50.         return (a + b) % matrix_mod;
  51.     }
  52.  
  53.     mat_type sub(mat_type a, mat_type b) {
  54.         return ((a - b) % matrix_mod + matrix_mod) % matrix_mod;
  55.     }
  56.  
  57.     mat_type mul(mat_type a, mat_type b) {
  58.         return (a * b) % matrix_mod;
  59.     }
  60.  
  61. #endif
  62.  
  63.     matrix operator +(const matrix& other) {
  64.         matrix ans(n_rows, n_cols);
  65.         for (int i = 0; i < n_rows; i++)
  66.             for (int j = 0; j < n_cols; j++)
  67.                 ans.m[i][j] = add(m[i][j], other.m[i][j]);
  68.         return ans;
  69.     }
  70.  
  71.     matrix operator -(const matrix& other) {
  72.         matrix ans(n_rows, n_cols);
  73.         for (int i = 0; i < n_rows; i++)
  74.             for (int j = 0; j < n_cols; j++)
  75.                 ans.m[i][j] = sub(m[i][j], other.m[i][j]);
  76.         return ans;
  77.     }
  78.  
  79.     matrix operator *(const matrix& other) {
  80.         matrix ans(n_rows, other.n_cols);
  81.         for (int i = 0; i < n_rows; i++)
  82.             for (int j = 0; j < other.n_cols; j++)
  83.                 for (int k = 0; k < n_cols; k++)
  84.                     ans.m[i][j] = add(ans.m[i][j], mul(m[i][k], other.m[k][j]));
  85.         return ans;
  86.     }
  87.  
  88.     matrix power(ll exp) {
  89.         matrix ans(n_rows, n_cols, true);
  90.         matrix multiplier = *this;
  91.         while (exp > 0) {
  92.             if (exp & 1)
  93.                 ans = ans * multiplier;
  94.             exp >>= 1;
  95.             multiplier = multiplier * multiplier;
  96.         }
  97.         return ans;
  98.     }
  99. };
  100.  
  101.  
  102. void solve() {
  103.     ll n, m;
  104.     cin >> n >> m;
  105.     matrix<ll> init(2 * m, 1);
  106.     matrix<ll> coeff(2 * m, 2 * m);
  107.     init.m[0][0] = 1;
  108.     for (int i = m; i < (2 * m); i++) {
  109.         coeff.m[i][i - m] = 1;
  110.     }
  111.     for (int i = 0; i < m; i++) {
  112.         if (i >= 2)
  113.             coeff.m[i][i - 2] = 1;
  114.         if ((i + 2) < m)
  115.             coeff.m[i][i + 2] = 1;
  116.         if (i >= 1)
  117.             coeff.m[i][i - 1 + m] = 1;
  118.         if ((i + 1) < m)
  119.             coeff.m[i][i + 1 + m] = 1;
  120.     }
  121.     coeff = coeff.power(n);
  122.     coeff = coeff * init;
  123.     cout << coeff.m[2 * m - 1][0];
  124. }
  125. int main()
  126. {
  127.     fastread;
  128.     solve();
  129.     return 0;
  130. }
Add Comment
Please, Sign In to add comment