Advertisement
Guest User

Untitled

a guest
Jan 21st, 2017
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const ll MOD = 1000 * 1000 * 1000 + 7;
  8.  
  9. ll madd(ll a, ll b) {
  10.     a += b;
  11.     if (a >= MOD)
  12.         a -= MOD;
  13.     return a;
  14. }
  15.  
  16. ll mmul(ll a, ll b) {
  17.     return a * b % MOD;
  18. }
  19.  
  20. struct Triple {
  21.     ll a, b, c;
  22.  
  23.     explicit Triple(ll a_ = 0, ll b_ = 0, ll c_ = 0): a(a_ % MOD), b(b_ % MOD), c(c_ % MOD) {}
  24.  
  25.     Triple operator+(const Triple& t) const {
  26.         return Triple(madd(a, t.a), madd(b, t.b), madd(c, t.c));
  27.     }
  28. };
  29.  
  30. struct Node {
  31.     ll f[2][2];
  32.    
  33.     Node() {
  34.         f[0][0] = f[0][1] = f[1][0] = f[1][1] = 0;    
  35.     }
  36.  
  37.     Node(const Triple& t): Node() {
  38.         f[0][0] = t.b;
  39.         f[0][1] = t.c;
  40.         f[1][0] = t.a;
  41.     }
  42. };
  43.  
  44. Node unite(const Node& l, const Node& r) {
  45.     Node res;
  46.     for (int resL = 0; resL < 2; resL++)
  47.         for (int resR = 0; resR < 2; resR++)
  48.             for (int mid = 0; mid < 2; mid++)
  49.                 res.f[resL][resR] = madd(res.f[resL][resR], mmul(l.f[resL][mid], r.f[mid][resR]));
  50.     return res;        
  51. }
  52.  
  53. struct Tree {
  54.     int size;
  55.     vector<Node> t;
  56.     vector<Triple> data;
  57.  
  58.     Tree(int n): size(n), t(4 * n + 10), data(4 * n + 10) {}
  59.  
  60.     ll get() const {
  61.         return t[0].f[0][0];
  62.     }
  63.  
  64.     void upd(int i, int tl, int tr, int pos, const Triple& add) {
  65.         if (tl == tr) {
  66.             data[i] = data[i] + add;
  67.             t[i] = Node(data[i]);
  68.             return;
  69.         }
  70.         int m = (tl + tr) / 2;
  71.         if (pos <= m)
  72.             upd(2 * i + 1, tl, m, pos, add);
  73.         else
  74.             upd(2 * i + 2, m + 1, tr, pos, add);
  75.         t[i] = unite(t[2 * i + 1], t[2 * i + 2]);    
  76.     }
  77.  
  78.     void upd(int pos, const Triple& add) {
  79.         upd(0, 0, size - 1, pos, add);
  80.     }
  81. };
  82.  
  83. vector<ll> gen(int n, ll x, ll a, ll b, ll c, ll add) {
  84.     vector<ll> res(n);  
  85.     res[0] = x;
  86.     for (int i = 1; i < n; i++)
  87.         res[i] = (a * res[i - 1] + b) % c + add;
  88.     return res;
  89. }
  90.  
  91.  
  92. void solve() {
  93.     int n, m;
  94.     cin >> n >> m;
  95.     Tree tree(n);
  96.     ll w0, aw, bw;
  97.     cin >> w0 >> aw >> bw;
  98.     vector<ll> w = gen(m, w0, aw, bw, n, 1);
  99.     ll d0, ad, bd;
  100.     cin >> d0 >> ad >> bd;
  101.     vector<ll> d = gen(m, d0, ad, bd, 3, 0);
  102.     vector<ll> z(m);
  103.     for (int i = 0; i < m; i++)
  104.         z[i] = max(1ll, min(ll(n), w[i] + d[i] - 1));
  105.     ll s0, as, bs;
  106.     cin >> s0 >> as >> bs;
  107.     vector<ll> s = gen(m, s0, as, bs, 1000 * 1000 * 1000, 1);
  108.     for (int i = 0; i < n; i++)
  109.         tree.upd(i, Triple(0, 1, 0));
  110.     assert (tree.get() == 1);
  111.     ll res = 0;
  112.     for (int i = 0; i < m; i++) {
  113.         Triple cur;
  114.         if (w[i] - z[i] == 1)
  115.             cur.a = s[i];
  116.         else if (w[i] == z[i])
  117.             cur.b = s[i];
  118.         else if (w[i] - z[i] == -1)
  119.             cur.c = s[i];
  120.         else
  121.             assert (false);
  122.         tree.upd(w[i] - 1, cur);
  123.         res = madd(res, tree.get());    
  124.     }
  125.     cout << res << endl;
  126. }
  127.  
  128. int main() {
  129.     ios_base::sync_with_stdio(0);
  130.     cin.tie(nullptr);
  131.  
  132.     int tt;
  133.     cin >> tt;
  134.     for (int t = 1; t <= tt; t++) {
  135.         cout << "Case #" << t << ": ";
  136.         solve();
  137.     }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement