Guest User

Untitled

a guest
Jan 21st, 2017
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.21 KB | None | 0 0
  1. // trace works only with c++ 14
  2.  
  3. #include<bits/stdc++.h>
  4. using namespace std;
  5. //#pragma comment (linker, "/STACK:256000000")
  6. #define TRACE
  7. #ifdef TRACE
  8. #define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
  9. template <typename Arg1>
  10. void __f(const char* name, Arg1&& arg1) {
  11. cerr << name << " : " << arg1 << endl;
  12. }
  13.  
  14. template <typename Arg1, typename... Args>
  15. void __f(const char* names, Arg1&& arg1, Args&&... args) {
  16. const char* comma = strchr(names + 1, ',');
  17. cerr.write(names, comma - names) << " : " << arg1<<" | ";
  18. __f(comma+1, args...);
  19. }
  20. #else
  21. #define trace(...)
  22. #endif
  23.  
  24. #define all(a) a.begin(), a.end()
  25. #define endl '\n'
  26. #define mp make_pair
  27. #define pb push_back
  28. #define f first
  29. #define s second
  30. #define boost ios_base::sync_with_stdio(false);
  31. #define FOR(i, a, b) for (int i = (a); i < (b); ++i)
  32. #define REP(i, n) FOR(i, 0, n)
  33.  
  34. typedef long long llint;
  35. typedef long long ll ;
  36. typedef pair<int, int> pii;
  37. typedef vector<int> vi;
  38. typedef vector<pii> vii;
  39.  
  40. const int mod = 1e9 + 7 ;
  41. ll powmod(ll a,ll b) {ll res=1;if(a>=mod)a%=mod;for(;b;b>>=1){if(b&1)res=res*a;if(res>=mod)res%=mod;a=a*a;if(a>=mod)a%=mod;}return res;}
  42. ll gcd(ll a , ll b){return a==0?b:gcd(b%a,a);}
  43. /*---------------------------------------------------------------------------------------------------------------------*/
  44. const int maxn = 800000 + 100;
  45. const int inf = INT_MAX;
  46. ll tree[maxn * 4];
  47. ll w[maxn], d[maxn], z[maxn], s[maxn], g[maxn][3];
  48. ll aw, bw, ad, bd, as, bs, s1, d1, w1;
  49. ll n, m;
  50. int MOD = 1000 * 1000 * 1000;
  51. #define front 2
  52. #define back 0
  53. #define same 1
  54. void build(int node, int a, int b)
  55. {
  56. if(a == b)
  57. {
  58. tree[node] = 1;
  59. return;
  60. }
  61. build(node * 2, a, (a + b) / 2);
  62. build(node * 2 + 1, (a + b) / 2 + 1, b);
  63. tree[node] = 1;
  64. }
  65. ll query(int node, int a, int b, int i, int j)
  66. {
  67. if(a > b || a > j || b < i || j < i)
  68. return 1;
  69. if(a >= i && b <= j)
  70. return tree[node];
  71. ll ret = query(node * 2, a, (a + b) / 2, i, j) * query(node * 2 + 1, (a + b) / 2 + 1, b, i, j);
  72. if(ret >= mod)
  73. ret %= mod;
  74. return ret;
  75. }
  76. ll upd(int node, int a, int b, int i)
  77. {
  78. if(a > b)
  79. return 1;
  80. if( a > i || b < i)
  81. return tree[node];
  82. if(a == b)
  83. {
  84. tree[node] = g[a][1];
  85. //trace(tree[node], a, b, i);
  86. return tree[node];
  87. }
  88. ll ret1 = upd(node * 2, a, (a + b) / 2, i) * upd(node * 2 + 1, (a + b) / 2 + 1, b, i);
  89. if(ret1 >= mod)
  90. ret1 %= mod;
  91. ll ret2 = query(1, 1, n, a, (a + b) / 2 - 1) * query(1, 1, n, (a + b) / 2 + 2, b);
  92. if(ret2 >= mod)
  93. ret2 %= mod;
  94. ret2 = ret2 * g[(a + b) / 2][front];
  95. if(ret2 >= mod)
  96. ret2 %= mod;
  97. ret2 = ret2 * g[(a + b) / 2 + 1][back];
  98. if(ret2 >= mod)
  99. ret2 %= mod;
  100. //trace(ret1, ret2, a, b, i);
  101. ret1 += ret2;
  102. if(ret1 >= mod)
  103. ret1 -= mod;
  104. return tree[node] = ret1;
  105. }
  106. int main() {
  107. freopen("in.txt","r",stdin);
  108. freopen("out.txt","w",stdout);
  109. boost;cin.tie(0);
  110. int t, tt = 0, i;
  111. cin >> t;
  112. while(t--)
  113. {
  114. tt++;
  115. cout << "Case #" << tt << ": ";
  116. cin >> n >> m;
  117. cin >> w1 >> aw >> bw;
  118. cin >> d1 >> ad >> bd;
  119. cin >> s1 >> as >> bs;
  120. w[1] = w1;
  121. d[1] = d1;
  122. s[1] = s1;
  123. for(i = 2; i <= m; i++)
  124. w[i] = (w[i - 1] * aw + bw) % n + 1;
  125. for(i = 2; i <= m; i++)
  126. d[i] = (ad * d[i - 1] + bd) % 3;
  127. for(i = 1; i <= m; i++)
  128. z[i] = max(1LL, min(n, w[i] + d[i] - 1));
  129. for(i = 2; i <= m; i++)
  130. s[i] = (as * s[i - 1] + bs) % MOD + 1;
  131. build(1, 1, n);
  132. ll ans = 0;
  133. for(i = 0; i <= n + 5; i++)
  134. {
  135. g[i][same] = g[i][front] = g[i][back] = 0;
  136. if(i >= 1 && i <= n)
  137. g[i][same] = 1;
  138. }
  139. for(i = 1; i <= m; i++)
  140. {
  141. g[w[i]][z[i] - w[i] + 1] += s[i];
  142. if(g[w[i]][z[i] - w[i] + 1] >= mod)
  143. g[w[i]][z[i] - w[i] + 1] -= mod;
  144. upd(1, 1, n, w[i]);
  145. ans += tree[1];
  146. if(ans >= mod)
  147. ans -= mod;
  148. }
  149. cout << ans << endl;
  150. }
  151. return 0;
  152. }
Add Comment
Please, Sign In to add comment