Advertisement
willy108

mahjong

Nov 20th, 2022
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.39 KB | None | 0 0
  1.  
  2. //misaka and elaina will carry me to red
  3.  
  4. #pragma GCC optimize("O3,unroll-loops")
  5. #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
  6.  
  7. #include <iostream>
  8. #include <cmath>
  9. #include <utility>
  10. #include <cassert>
  11. #include <algorithm>
  12. #include <vector>
  13. #include <array>
  14. #include <cstdio>
  15. #include <cstring>
  16. #include <functional>
  17. #include <numeric>
  18. #include <set>
  19. #include <queue>
  20. #include <map>
  21. #include <chrono>
  22. #include <random>
  23.  
  24. #define sz(x) ((int)(x.size()))
  25. #define all(x) x.begin(), x.end()
  26. #define pb push_back
  27. #define eb emplace_back
  28. #define kill(x, s) {if(x){ cout << s << "\n"; return ; }}
  29.  
  30. #ifndef LOCAL
  31. #define cerr while(0) cerr
  32. #endif
  33.  
  34. using ll = long long;
  35. using lb = long double;
  36.  
  37. const lb eps = 1e-9;
  38. const ll mod = 1e9 + 7, ll_max = 1e18;
  39. //const ll mod = (1 << (23)) * 119 +1, ll_max = 1e18;
  40. const int MX = 2e5 +10, int_max = 0x3f3f3f3f;
  41.  
  42. struct {
  43. template<class T>
  44. operator T() {
  45. T x; std::cin >> x; return x;
  46. }
  47. } in;
  48.  
  49. using namespace std;
  50.  
  51. const int NN = (1 << 18) + 10;
  52.  
  53. map<int, int> mm;
  54. vector<int> good;
  55. int go[80][5], ind = 2;
  56. ll dp[240][240][80];
  57. ll ans[240][240];
  58.  
  59. int comb(int i, int j, int k){
  60. return i*6 + j*2 + k;
  61. }
  62.  
  63. void bfs(){
  64. queue<int> q;
  65. q.push(1);
  66. mm[1] = 1;
  67. while(sz(q)){
  68. int b = q.front(); q.pop();
  69.  
  70. for(int j = 0; j<=4; j++){
  71. int poss =0 ;
  72. for(int i = 0; i<18; i++){
  73. if(b&(1 << i)){
  74. int a = i/6, b = (i/2)%3, c = i%2;
  75. int l = j - a - b;
  76. if(l < 0) continue;
  77. if(l>=2 && c == 0){
  78. poss |= (1 << comb(b, l-2, 1));
  79. }
  80. l %= 3;
  81. poss |= (1 << comb(b, l, c));
  82. }
  83. }
  84. if(mm.count(poss) == 0){
  85. mm[poss] = ind++;
  86. q.push(poss);
  87. if(poss&(1 << comb(0, 0, 1))){
  88. good.pb(mm[poss]);
  89. }
  90. }
  91. go[mm[b]][j] = mm[poss];
  92. }
  93. }
  94. assert(sz(mm) <= 80);
  95. }
  96.  
  97. void precomp(){
  98. bfs();
  99. dp[1][0][1] = 1;
  100. for(int i = 1; i<=210; i++){
  101. for(int j = 0; j<=210; j++){
  102. for(auto [v, k] : mm){
  103. for(int h = 0; h<=4; h++){
  104. (dp[i+1][j+h][go[k][h]] += dp[i][j][k]) %= mod;
  105. }
  106. }
  107. }
  108. }
  109. }
  110.  
  111. void solve(){
  112. int n = in, m = in;
  113. ll ans = 0;
  114. for(int x : good){
  115. ans += dp[n+1][m][x];
  116. }
  117. ans %= mod;
  118. cout << ans << "\n";
  119. }
  120.  
  121. signed main(){
  122. cin.tie(0) -> sync_with_stdio(0);
  123. precomp();
  124. int T = 1;
  125. cin >> T;
  126. for(int i = 1; i<=T; i++){
  127. cout << "Case #" << i << ": ";
  128. solve();
  129. }
  130. return 0;
  131. }
  132.  
  133.  
  134.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement