Guest User

buildwall_xorfire

a guest
Aug 17th, 2014
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1. #include <map>
  2. #include <set>
  3. #include <cmath>
  4. #include <ctime>
  5. #include <deque>
  6. #include <queue>
  7. #include <stack>
  8. #include <bitset>
  9. #include <cctype>
  10. #include <cstdio>
  11. #include <vector>
  12. #include <cassert>
  13. #include <complex>
  14. #include <cstdlib>
  15. #include <cstring>
  16. #include <fstream>
  17. #include <iomanip>
  18. #include <sstream>
  19. #include <iostream>
  20. #include <algorithm>
  21. using namespace std;
  22.  
  23. const int md = (int)1e9 + 7;
  24.  
  25. struct matrix
  26. {
  27.     vector <vector <int> > mat;
  28.     matrix(int n = 0, bool id = false)
  29.     {
  30.         mat.resize(n);
  31.         for (int i = 0; i < n; i++) mat[i].resize(n);
  32.         if (id) for (int i = 0; i < n; i++) mat[i][i] = 1;
  33.     }
  34.     inline int size() { return (int)mat.size(); }
  35.     vector <int>& operator[] (int i) { return mat[i]; }
  36. };
  37.  
  38. matrix operator * (matrix &a, matrix &b)
  39. {
  40.     int n = a.size();
  41.     matrix ret(n);
  42.     for (int i = 0; i < n; i++)
  43.         for (int j = 0; j < n; j++)
  44.             for (int k = 0; k < n; k++)
  45.             {
  46.                 ret[i][j] += 1ll * a[i][k] * b[k][j] % md;
  47.                 if (ret[i][j] >= md) ret[i][j] -= md;
  48.             }
  49.     return ret;
  50. }
  51.  
  52. matrix pow(matrix &a, long long p)
  53. {
  54.     int n = a.size();
  55.     matrix ret(n, true);
  56.     while (p > 0)
  57.     {
  58.         if (p % 2 == 1) ret = ret * a;
  59.         p /= 2, a = a * a;
  60.     }
  61.     return ret;
  62. }
  63.  
  64. inline int g(int x) { return min(2, 1+x); }
  65. inline int conv(int x, int y, int z) { return x * 9 + y * 3 + z; }
  66.  
  67. matrix base()
  68. {
  69.     matrix ret(27);
  70.     for (int u = 0; u < 3; u++)
  71.         for (int v = 0; v < 3; v++)
  72.             for (int w = 0; w < 3; w++)
  73.             {
  74.                 int row = conv(u, v, w);
  75.                 if (u == 2 and v == 2 and w == 2)
  76.                 {
  77.                     ret[row][conv(2, 2, 2)]++;
  78.                     for (int i = 0; i < 3; i++) ret[row][conv(2, 2, i)]++;
  79.                     for (int i = 0; i < 3; i++) ret[row][conv(i, 2, 2)]++;
  80.                     for (int i = 0; i < 3; i++)
  81.                         for (int j = 0; j < 3; j++)
  82.                             for (int k = 0; k < 3; k++)
  83.                                 ret[row][conv(i, j, k)]++;
  84.                     continue;
  85.                 }
  86.                 if (u == 2 and v == 2)
  87.                 {
  88.                     ret[row][conv(2, 2, g(w))]++;
  89.                     for (int i = 0; i < 3; i++)
  90.                         for (int j = 0; j < 3; j++)
  91.                             ret[row][conv(i, j, g(w))]++;
  92.                     continue;
  93.                 }
  94.                 if (u == 2 and w == 2)
  95.                 {
  96.                     for (int i = 0; i < 3; i++)
  97.                         for (int j = 0; j < 3; j++)
  98.                             ret[row][conv(i, g(v), j)]++;
  99.                     continue;
  100.                 }
  101.                 if (v == 2 and w == 2)
  102.                 {
  103.                     ret[row][conv(g(u), 2, 2)]++;
  104.                     for (int i = 0; i < 3; i++)
  105.                         for (int j = 0; j < 3; j++)
  106.                             ret[row][conv(g(u), i, j)]++;
  107.                     continue;
  108.                 }
  109.                 if (u == 2)
  110.                 {
  111.                     for (int i = 0; i < 3; i++)
  112.                         ret[row][conv(i, g(v), g(w))]++;
  113.                     continue;
  114.                 }
  115.                 if (v == 2)
  116.                 {
  117.                     for (int i = 0; i < 3; i++)
  118.                         ret[row][conv(g(u), i, g(w))]++;
  119.                     continue;
  120.                 }
  121.                 if (w == 2)
  122.                 {
  123.                     for (int i = 0; i < 3; i++)
  124.                         ret[row][conv(g(u), g(v), i)]++;
  125.                     continue;
  126.                 }
  127.                 ret[row][conv(g(u), g(v), g(w))]++;
  128.             }
  129.     return ret;
  130. }
  131.  
  132. int go(int n)
  133. {
  134.     if (n == 1) return 4;
  135.     matrix b = base();
  136.     b = pow(b, n-2);
  137.     int a[] = {1, 1, 2, 1, 2, 3, 2, 3, 7, 1, 1, 2, 2, 4, 6, 3, 5, 12, 2, 2, 4, 3, 6, 9, 7, 12, 29};
  138.     int ret = 0;
  139.     for (int i = 0; i < 27; i++)
  140.     {
  141.         ret += 1ll * b[26][i] * a[i] % md;
  142.         if (ret >= md) ret -= md;
  143.     }
  144.     return ret;
  145. }
  146.  
  147. int main()
  148. {
  149.     int t; scanf("%d", &t);
  150.     while (t--)
  151.     {
  152.         int n; scanf("%d", &n);
  153.         printf("%d\n", go(n));
  154.     }
  155.     return 0;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment