Guest User

Untitled

a guest
Jan 28th, 2014
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.78 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:100000000000000")
  2. #include <stdio.h>
  3. #include <vector>
  4. #include <map>
  5. #include <string>
  6. #include <algorithm>
  7. #include <set>
  8. #include <stack>
  9. #include <queue>
  10. #include <math.h>
  11. #include <stdlib.h>
  12. #include <iostream>
  13. #include <iomanip>
  14. #include <sstream>
  15. #include <string.h>
  16. #include <cctype>
  17. #include <cassert>
  18. #include <ctime>
  19. #define mp make_pair
  20. #define pb push_back
  21. #define lo int
  22. #define li long long int
  23. #define db long double
  24. #define FOR(i, n) for(lo i = 0; i < (n); i++)
  25. #define pi 3.14159265358979323
  26. #define eps 1e-10
  27. #define MN 510
  28. #define sz(a) (lo) (a).size()
  29. #define SM 1<<6
  30. using namespace std;
  31. const li INF = 2e9;
  32.  
  33.  
  34. lo dp[MN][SM];
  35. map<lo, vector<lo> > g[SM];
  36. set<pair<lo, pair<lo, lo> > > own[SM];
  37. map<li, lo> kash;
  38. inline bool submask(lo a, lo b)
  39. {
  40. return ((a ^ b) | a) == a;
  41. }
  42. li base;
  43. inline li wat(lo id, vector<lo> &good)
  44. {
  45. sort(good.begin(), good.end());
  46. li now = 1, out = 0;
  47. FOR(i, sz(good))
  48. {
  49. now *= base;
  50. out += (good[i] + 1) * now;
  51. }
  52. now *= base;
  53. return out + (id + 1) * now;
  54. }
  55. inline bool is_good(lo a, lo n)
  56. {
  57. lo cnt = 0;
  58. FOR(i, n)
  59. {
  60. if(!(a & (1<<i)))
  61. {
  62. if(cnt & 1)
  63. return false;
  64. cnt = 0;
  65. }
  66. else
  67. cnt++;
  68. }
  69. return !(cnt & 1);
  70. }
  71. lo mod = 1000000007;
  72. inline lo take_me(lo id, vector<lo> &now)
  73. {
  74. li hash = wat(id, now);
  75. if(kash.count(hash))
  76. return kash[hash];
  77. if(!id)
  78. {
  79. lo sum = 0;
  80. FOR(i, sz(now))
  81. {
  82. sum = (sum + dp[id][now[i]]) % mod;
  83. }
  84. return kash[hash] = sum;
  85. }
  86. map<lo, map<lo, lo> > taked;
  87. FOR(i, sz(now))
  88. {
  89. lo to = now[i];
  90. for(map<lo, vector<lo> > ::iterator it = g[to].begin(); it != g[to].end(); it++)
  91. {
  92. FOR(j, sz(it->second))
  93. {
  94. lo v = it->first;
  95. lo to2 = it->second[j];
  96. taked[v][to2]++;
  97. }
  98. }
  99. }
  100. lo sum = 0;
  101. for(map<lo, map<lo, lo> >::iterator it = taked.begin(); it != taked.end(); it++)
  102. {
  103. if(id == 1 && it->first)
  104. continue;
  105. vector<lo> with;
  106. for(map<lo, lo>::iterator it2 = it->second.begin(); it2 != it->second.end(); it2++)
  107. {
  108. with.push_back(it2->first);
  109. }
  110. sum = (sum + take_me(id - 1, with)) % mod;
  111. }
  112. return kash[hash] = sum;
  113. }
  114. int main()
  115. {
  116. //#ifdef _DEBUG
  117. freopen("input.txt", "r", stdin);
  118. freopen("output.txt", "w", stdout);
  119. //#else
  120. // freopen("roses.in", "r", stdin);
  121. // freopen("roses.out", "w", stdout);
  122. //#endif
  123. lo n, m;
  124. cin >> n >> m >> base;
  125. memset(dp, 0, sizeof dp);
  126. FOR(i, (1<<n))
  127. {
  128. FOR(j, (1<<n))
  129. {
  130. FOR(k, (1<<n))
  131. {
  132. if(!submask(j, k))
  133. continue;
  134. lo vi = (j ^ k);
  135. if(!submask(vi, i))
  136. continue;
  137. lo temp = (vi ^ i);
  138. if(is_good(temp, n))
  139. g[i][j].push_back(k);
  140.  
  141. }
  142. }
  143. }
  144. memset(dp, 0, sizeof dp);
  145. dp[0][0] = 1;
  146. for(lo i = 1; i <= m + 1; i++)
  147. {
  148. FOR(j, (1<<n))
  149. {
  150. for(map<lo, vector<lo> >::iterator it = g[j].begin(); it != g[j].end(); it++)
  151. {
  152. if(i == 1 && it->first)
  153. continue;
  154. dp[i][j] = (dp[i][j] + take_me(i - 1, it->second)) % mod;
  155. }
  156. }
  157. }
  158. cout << "{";
  159. for(lo i = 1; i <= m + 1; i++)
  160. {
  161. cout << dp[i][0];
  162. if(i == m + 1)
  163. cout << "}";
  164. else
  165. cout << ",";
  166. }
  167. }
Advertisement
Add Comment
Please, Sign In to add comment