Advertisement
Na2a

101 July D

Jul 23rd, 2015
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pb push_back
  4. #define mp make_pair
  5.  
  6. #define f first
  7. #define s second
  8.  
  9. #define pii pair<int, int>
  10.  
  11. using namespace std;
  12.  
  13. typedef long long ll;
  14.  
  15. const int INF = (int) 1e9 + 7;
  16. const int MAXN = (int) 5e4 + 7;
  17.  
  18. int tests;
  19. int n, banned;
  20.  
  21. int dp[MAXN][1 << 4][2];
  22. int ways[MAXN][1 << 4][2];
  23.  
  24. void add(int &x, int y) {
  25.   x += y;
  26.   if (x >= INF)
  27.     x -= INF;
  28. }
  29.  
  30. int main() {
  31.   #ifdef LOCAL
  32.   freopen("in", "r", stdin);
  33.   #endif // LOCAL
  34.  
  35.   scanf("%d", &tests);
  36.   while (tests--) {
  37.     scanf("%d%d", &n, &banned);
  38.     for (int mask = 0; mask < 16; mask++) {
  39.       vector<int> arr;
  40.       for (int i = 0; i < 4; i++)
  41.         arr.pb((mask >> i) & 1);
  42.       reverse(arr.begin(), arr.end());
  43.       int sum = 0, ptr = 0;
  44.       while (ptr < 4) {
  45.         sum += arr[ptr] + 1;
  46.         if (arr[ptr]) ptr += 2;
  47.         else ptr++;
  48.       }
  49.       dp[4][mask][ptr == 4] += sum;
  50.       ways[4][mask][ptr == 4]++;
  51.     }
  52.     for (int len = 4; len < n; len++) {
  53.       for (int mask = 0; mask < 16; mask++) {
  54.         for (int take = 0; take < 2; take++) {
  55.           int sum = 0;
  56.           for (int i = 0; i < 4; i++)
  57.             sum += ((mask >> i) & 1) + 1;
  58.           if (sum + 1 != banned) {
  59.             // place 1
  60.             int nmask = (mask & 7) << 1;
  61.             if (take) {
  62.               add(ways[len + 1][nmask][take], ways[len][mask][take]);
  63.               add(dp[len + 1][nmask][take], dp[len][mask][take]);
  64.               add(dp[len + 1][nmask][take], ways[len][mask][take]);
  65.             } else {
  66.               add(ways[len + 1][nmask][1], ways[len][mask][take]);
  67.               add(dp[len + 1][nmask][1], dp[len][mask][take]);
  68.             }
  69.           }
  70.           if (sum + 2 != banned) {
  71.             // place 2
  72.             int nmask = (mask & 7) << 1;
  73.             ++nmask;
  74.             if (take) {
  75.               add(ways[len + 1][nmask][0], ways[len][mask][take]);
  76.               add(dp[len + 1][nmask][0], dp[len][mask][take]);
  77.               add(dp[len + 1][nmask][0], ways[len][mask][take]);
  78.               add(dp[len + 1][nmask][0], ways[len][mask][take]);
  79.             } else {
  80.               add(ways[len + 1][nmask][1], ways[len][mask][take]);
  81.               add(dp[len + 1][nmask][1], dp[len][mask][take]);
  82.             }
  83.           }
  84.         }
  85.       }
  86.     }
  87.     int ans = 0, all = 0;
  88.     for (int mask = 0; mask < 16; mask++)
  89.       for (int take = 0; take < 2; take++)
  90.         add(ans, dp[n][mask][take]);
  91.     printf("%d\n", ans);
  92.     for (int i = 0; i <= n; i++)
  93.       for (int mask = 0; mask < 16; mask++)
  94.         for (int take = 0; take < 2; take++)
  95.           dp[i][mask][take] = ways[i][mask][take] = 0;
  96.   }
  97.  
  98.   return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement