Guest User

Untitled

a guest
Nov 6th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <map>
  4. #include <vector>
  5. #include <utility>
  6. #include <cmath>
  7. #include <cstring>
  8. #include <algorithm>
  9. using namespace std;
  10.  
  11. typedef long long int ll;
  12. typedef pair<ll, ll> ipair;
  13. #define mod 1000000007
  14. #define pb push_back
  15. #define mp make_pair
  16. #define ff first
  17. #define ss second
  18. #define sz size()
  19. #define ln length()
  20. #define rep(i,n) for(i=0;i<n;i++)
  21. #define fu(i,a,n) for(i=a;i<=n;i++)
  22. #define fd(i,n,a) for(i=n;i>=a;i--)
  23. #define all(a)  a.begin(),a.end()
  24. #define gi(n) scanf("%d",&n)
  25. #define gl(n) scanf("%lld",&n)
  26. #define pi(n) printf("%d",n)
  27. #define pl(n) printf("%lld",n);
  28. #define pp printf(" ")
  29. #define pn printf("\n")
  30. #define LN 31
  31. #define MAX 100005
  32. #define EXP 30
  33. ll expo;
  34. ll mat[EXP][EXP];
  35. void mul(ll a[][EXP], ll b[][EXP], ll ans[][EXP]) {
  36.     ll i, j, k;
  37.     rep(i, expo) {
  38.         rep(j, expo) {
  39.             ans[i][j] = 0;
  40.             rep(k, expo) {
  41.                 ans[i][j] = (ans[i][j] + (a[i][k] * b[k][j])%mod)%mod;
  42.             }
  43.         }
  44.     }
  45. }
  46.  
  47. void copy(ll a[][EXP], ll b[][EXP]) {
  48.     ll i, j;
  49.     rep(i, expo) {
  50.         rep(j, expo) {
  51.             a[i][j] = b[i][j];
  52.         }
  53.     }
  54. }
  55. void calc(ll a[][EXP], ll n, ll ans[][EXP]) {
  56.     ll i, j;
  57.     rep(i, expo) {
  58.         rep(j, expo) {
  59.             if(i == j) {
  60.                 ans[i][j] = 1;
  61.             }
  62.             else {
  63.                 ans[i][j] = 0;
  64.             }
  65.         }
  66.     }
  67.     if(n == 0) {
  68.         return;
  69.     }
  70.     ll temp[EXP][EXP];
  71.     while(n > 0) {
  72.         if(n&1) {
  73.             mul(ans, a, temp);
  74.             copy(ans, temp);
  75.         }
  76.         mul(a, a, temp);
  77.         copy(a, temp);
  78.         n>>=1;
  79.     }
  80. }
  81.  
  82. //1->M, 2->W, 3->S
  83.  
  84. int checkVal(ll val) {
  85.     //cout << val << endl;
  86.     vector<int> v;
  87.     while(val) {
  88.         v.pb(val%10);
  89.         val/=10;
  90.     }
  91.     int c1 = 0;
  92.     int c2 = 0;
  93.     int c3 = 0;
  94.     ll i;
  95.     rep(i, v.size()) {
  96.         if(v[i] == 1) {
  97.             if(i) {
  98.                 c2++;
  99.             }
  100.             if(i < 3) {
  101.                 c1++;
  102.             }
  103.         }
  104.         else if(v[i] == 3) {
  105.             c3++;
  106.         }
  107.     }
  108.     if(c3 > 2) {
  109.         return 0;
  110.     }
  111.     if(c1 > 1 || c2 > 1) {
  112.         return 0;
  113.     }
  114.     rep(i, v.size() - 1) {
  115.         if(v[i] == 2 && v[i + 1] == 2) {
  116.             return 0;
  117.         }
  118.     }
  119.     //cout << "ok" << endl;
  120.     return 1;
  121. }
  122. int main() {
  123.     vector<ll> v;
  124.     ll i, j, k;
  125.     fu(i, 1, 3) {
  126.         fu(j, 1, 3) {
  127.             fu(k, 1, 3) {
  128.                 ll val = i * 100 + j * 10 + k;
  129.                 if(checkVal(val)) {
  130.                     v.pb(val);
  131.                     //cout << val << " ";
  132.                 }
  133.             }
  134.         }
  135.     }
  136.     //cout << endl;
  137.     expo = v.size();
  138.     rep(i, v.size()) {
  139.         rep(j, v.size()) {
  140.             if(v[i]%100 == v[j]/10) {
  141.                 ll val = v[i] * 10 + v[j]%10;
  142.                 //cout << val << endl;
  143.                 mat[i][j] = checkVal(val);
  144.             }
  145.             else {
  146.                 mat[i][j] = 0;
  147.             }
  148.             //cout << mat[i][j] << " ";
  149.         }
  150.         //cout << endl;
  151.     }
  152.     int t;
  153.     gi(t);
  154.     while(t--) {
  155.         ll n;
  156.         gl(n);
  157.         if(!n) {
  158.             pl(n + 1);
  159.             pn;
  160.             continue;
  161.         }
  162.         if(n <= 2) {
  163.             pl(4 * n - 1);
  164.             pn;
  165.         }
  166.         else {
  167.             ll arr[EXP][EXP];
  168.             ll ans[EXP][EXP];
  169.             copy(arr, mat);
  170.             calc(arr, n - 3, ans);
  171.             ll res = 0;
  172.             rep(i, expo) {
  173.                 rep(j, expo) {
  174.                     res = (res + ans[i][j])%mod;
  175.                 }
  176.             }
  177.             pl(res);
  178.             pn;
  179.         }
  180.     }
  181.     return 0;
  182. }
Add Comment
Please, Sign In to add comment