Guest User

Untitled

a guest
Mar 2nd, 2021
633
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.39 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> pi;
  6. typedef pair<ll,ll> pl;
  7. typedef vector<int> vi;
  8. typedef vector<ll> vl;
  9.  
  10. #define FOR(i, a, b) for (int i=a; i<(b); i++)
  11. #define F0R(i, a) for (int i=0; i<(a); i++)
  12. #define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
  13. #define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)
  14. #define trav(a,x) for (auto& a : x)
  15.  
  16. #define sz(x) (int)(x).size()
  17. #define pb push_back
  18. #define f first
  19. #define s second
  20. #define lb lower_bound
  21. #define ub upper_bound
  22. #define all(x) x.begin(), x.end()
  23. #define ins insert
  24.  
  25. const int MOD = 1000000007;
  26.  
  27. ll modExp(ll base, ll power) {
  28. if (power == 0) {
  29. return 1;
  30. } else {
  31. ll cur = modExp(base, power / 2); cur = cur * cur; cur = cur % MOD;
  32. if (power % 2 == 1) cur = cur * base;
  33. cur = cur % MOD;
  34. return cur;
  35. }
  36. }
  37.  
  38. ll choose[501][501];
  39.  
  40. void solve() {
  41. int N, M; cin >> N >> M;
  42. vector<int> graph[2*N];
  43. F0R(i, M) {
  44. int X, Y; cin >> X >> Y; X--; Y--;
  45. graph[X].pb(Y+N);
  46. graph[X+N].pb(Y);
  47. graph[Y].pb(X+N);
  48. graph[Y+N].pb(X);
  49. }
  50. int dist[2*N]; F0R(i, 2*N) dist[i] = 1000000;
  51. queue<int> q;
  52. q.push(0);
  53. dist[0] = 0;
  54. while (!q.empty()) {
  55. int x = q.front(); q.pop();
  56. trav(a, graph[x]) {
  57. if (dist[a] > dist[x] + 1) {
  58. dist[a] = dist[x] + 1; q.push(a);
  59. }
  60. }
  61. }
  62. if (dist[N] > 2*N+10) {
  63. ll cnt[2*N+10]; F0R(i, 2*N+10) cnt[i] = 0;
  64. F0R(i, N) {
  65. cnt[min(dist[i], dist[i+N])]++;
  66. }
  67. ll ans = 1;
  68. FOR(i, 1, 2*N+10) {
  69. F0R(j, cnt[i]) {
  70. ans *= (modExp(2, cnt[i-1]) + MOD - 1) % MOD;
  71. ans %= MOD;
  72. }
  73. }
  74. cout << ans << endl; return;
  75. }
  76. ll ans = 1;
  77. map<int, int> cnt[4*N+10];
  78. F0R(i, N) {
  79. int x = min(dist[i], dist[i+N]); int y = max(dist[i], dist[i+N]);
  80. cnt[x+y][x]++;
  81. //cout << x << " " << y << endl;
  82. }
  83.  
  84. F0Rd(m, 4*N+10) {
  85. vi tbr;
  86. trav(a, cnt[m]) if (a.s == 0) tbr.pb(a.f);
  87. trav(a, tbr) cnt[m].erase(a);
  88. int lst = -100;
  89. vl dp = {1};
  90. bool doproc = false;
  91. trav(a, cnt[m]) {
  92. if (a.s == 0) continue;
  93. //cout << m << " " << a.f << " " << a.s << endl;
  94. if (lst < a.f-1) {
  95. ll cur = 0;
  96. trav(a, dp) cur += a;
  97. cur %= MOD;
  98. ans *= cur;
  99. ans %= MOD;
  100. dp.clear();
  101. dp = vl(a.s+1);
  102. dp[0] = 1;
  103. }
  104. lst = a.f;
  105. if (a.f*2+1 == m) {
  106. doproc = true; break;
  107. } else if (a.f == cnt[m].rbegin()->f) {
  108. break;
  109. }
  110. ll cn = cnt[m][a.f+1];
  111. vl nxt(cn+1);
  112. ll dow = 0; if (m > 2) dow = cnt[m-2][a.f-1];
  113. dow = modExp(2, dow) - 1;
  114. if (a.f == 0) {
  115. F0R(i, cn+1) {
  116. nxt[i] = choose[cn][i];
  117. }
  118. } else{
  119. vl mid(sz(dp));
  120. F0R(i, sz(dp)) {
  121. F0R(j, i+1) {
  122. ll val = dp[i] * choose[i][j]; val %= MOD;
  123. val *= modExp(dow, sz(dp)-1-j); val %= MOD;
  124. mid[j] += val;
  125. mid[j] %= MOD;
  126. }
  127. }
  128. F0R(i, sz(mid)) {
  129. ll defWays[cn+1];
  130. F0R(j, cn+1) {
  131. ll ival = modExp(2, j) - 1;
  132. ll val = modExp(ival, i) * modExp(ival+1, sz(mid)-1-i);
  133. val %= MOD;
  134. ll mul = MOD-1;
  135. defWays[j] = val;
  136. ll numm = choose[cn][j]; val *= numm; val %= MOD;
  137. nxt[j] += val * mid[i]; nxt[j] %= MOD;
  138. F0Rd(k, j) {
  139. ll cx = choose[j][k] * defWays[k]; cx %= MOD; cx *= mul; cx %= MOD;
  140. cx *= numm; cx %= MOD;
  141. nxt[j] += cx * mid[i]; nxt[j] %= MOD;
  142. mul *= MOD-1; mul %= MOD;
  143. }
  144. }
  145. }
  146. }
  147. dp = nxt;
  148. /*if (m == 11) {
  149. cout << a.f << " TEST" << endl;
  150. trav(b, dp) {
  151. cout << b << endl;
  152. }
  153. }*/
  154.  
  155. }
  156. ll cur = 0;
  157. if (lst == 0) {
  158. cur = 1;
  159. } else if (!doproc) {
  160. ll dow = 0; if (m > 2) dow = cnt[m-2][lst-1];
  161. dow = modExp(2, dow) - 1;
  162. F0R(i, sz(dp)) {
  163. cur += (modExp(dow, sz(dp)-1) * dp[i]);
  164. cur %= MOD;
  165. }
  166. } else {
  167. ll ways[sz(dp)];
  168. F0R(i, sz(dp)) {
  169. int K = sz(dp)-1;
  170. ways[i] = modExp(2, (K*K+K)/2);
  171. ll mul = MOD-1;
  172. FOR(j, 1, i+1) {
  173. ll val = mul * choose[i][j]; val %= MOD;
  174. val *= modExp(2, ((K-j)*(K-j+1))/2);
  175. ways[i] += val; ways[i] %= MOD;
  176. mul *= MOD-1; mul %= MOD;
  177. }
  178.  
  179. }
  180. ll dow = 0; if (m > 2) dow = cnt[m-2][lst-1];
  181. dow = modExp(2, dow) - 1;
  182. F0R(i, sz(dp)) {
  183. F0R(j, i+1) {
  184.  
  185. ll val = choose[i][j] * ways[j]; val %= MOD; val *= dp[i]; val %= MOD;
  186. val *= modExp(dow, sz(dp)-1-j); val %= MOD;
  187. cur += val; cur %= MOD;
  188. }
  189. }
  190. }
  191. ans *= cur;
  192. ans %= MOD;
  193. }
  194.  
  195. cout << ans << endl;
  196. }
  197.  
  198. int main() {
  199. ios_base::sync_with_stdio(0); cin.tie(0);
  200. F0R(i, 501) {
  201. F0R(j, 501) {
  202. if (i < j) {
  203. choose[i][j] = 0;
  204. } else if (j == 0) {
  205. choose[i][j] = 1;
  206. } else {
  207. choose[i][j] = choose[i-1][j-1] + choose[i-1][j];
  208. choose[i][j] %= MOD;
  209. }
  210. }
  211. }
  212.  
  213.  
  214. int T; cin >> T;
  215. while(T--) {
  216. solve();
  217. }
  218.  
  219. return 0;
  220. }
Advertisement
Add Comment
Please, Sign In to add comment