Advertisement
Guest User

Untitled

a guest
Jul 18th, 2017
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct Matrix {
  5.     int n;
  6.     vector<vector<unsigned>> val;
  7.  
  8.     Matrix () {}
  9.  
  10.     Matrix (int _n) {
  11.         n = _n;
  12.         val.assign(n, vector<unsigned>(n, 0));
  13.     }
  14.  
  15.     vector<unsigned>& operator[] (int i) {
  16.         return val[i];
  17.     }
  18.  
  19.     Matrix operator* (Matrix a) {
  20.         Matrix ans(n);
  21.         for (int i = 0; i < n; ++i)
  22.             for (int j = 0; j < n; ++j)
  23.                 for (int k = 0; k < n; ++k)
  24.                     ans[i][k] += val[i][j] * a[j][k];
  25.         return ans;
  26.     }
  27.  
  28.     vector<unsigned> operator* (vector<unsigned> a) {
  29.         vector<unsigned> ans(n);
  30.         for (int i = 0; i < n; ++i)
  31.             for (int j = 0; j < n; ++j)
  32.                 ans[j] += val[i][j] * a[i];
  33.         return ans;
  34.     }
  35. };
  36.  
  37. int sq(int x) {
  38.     return x * x;
  39. }
  40.  
  41. const int BASE = 7;
  42. const int LOG = 30;
  43.  
  44. vector<int> step[BASE], pref_sum[BASE];
  45. int siz[BASE];
  46.  
  47. void precalc_steps(int base) {
  48.     step[base].resize(base);
  49.     pref_sum[base].resize(base + 1);
  50.     int sz = 0;
  51.     for (int i = 0; i < base; ++i) {
  52.         pref_sum[base][i] = sz;
  53.         step[base][i] = sq(max(i, base - 1 - i));
  54.         sz += step[base][i];
  55.     }
  56.     pref_sum[base][base] = sz;
  57.     siz[base] = sz;
  58. }
  59.  
  60. Matrix transitions(int base) {
  61.     Matrix ans(siz[base]);
  62.     for (int i = 0; i < base; ++i) {
  63.         for (int j = 1; j < step[base][i]; ++j)
  64.             ans[pref_sum[base][i] + j][pref_sum[base][i] + j - 1] = 1;
  65.         for (int j = 0; j < base; ++j) {
  66.             if (j == i) continue;
  67.             ans[pref_sum[base][j + 1] - sq(i - j)][pref_sum[base][i + 1] - 1] = 1;
  68.         }
  69.     }
  70.     return ans;
  71. }
  72.  
  73. vector<unsigned> start(int base) {
  74.     vector<unsigned> ans(siz[base]);
  75.     for (int i = 1; i < base; ++i)
  76.         ans[pref_sum[base][i + 1] - 1] = 1;
  77.     return ans;
  78. }
  79.  
  80. Matrix pw[BASE][LOG];
  81.  
  82. void precalc_powers(int base) {
  83.     pw[base][0] = transitions(base);
  84.     for (int i = 1; i < LOG; ++i)
  85.         pw[base][i] = pw[base][i - 1] * pw[base][i - 1];
  86. }
  87.  
  88. void precalc() {
  89.     for (int i = 2; i < BASE; ++i) {
  90.         precalc_steps(i);
  91.         precalc_powers(i);
  92.     }
  93. }
  94.  
  95. int main() {
  96.     ios::sync_with_stdio(false);
  97.     cin.tie(0);
  98.     precalc();
  99.     int t;
  100.     cin >> t;
  101.     for (int _ = 1; _ <= t; ++_) {
  102.         int b, sc;
  103.         cin >> b >> sc;
  104.         vector<unsigned> v = start(b);
  105.         for (int i = 0; i < LOG; ++i)
  106.             if (sc & (1 << i))
  107.                 v = pw[b][i] * v;
  108.         unsigned ans = 0;
  109.         for (int i = 0; i < b; ++i)
  110.             ans += v[pref_sum[b][i + 1] - 1];
  111.         cout << "Case " << _ << ": " << ans << '\n';
  112.     }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement