Advertisement
msatskevich

Untitled

Jan 29th, 2020
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.50 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. const int L = 64, N = 1e6 + 10;
  7. const long long M = 1e9 + 7;
  8.  
  9. int n, m;
  10. long long k;
  11. int fr;
  12. vector <pair <int, int> > req;
  13. vector <long long> fact;
  14. vector <pair <int, int> > near;
  15. vector <int> var;
  16. vector <int> cis;
  17. vector <int> ciss;
  18. int ans;
  19.  
  20. long long pw(long long a, long long n) {
  21.     if (n == 0)
  22.         return 1;
  23.     if (n % 2 == 1)
  24.         return (a * pw(a, n - 1)) % M;
  25.     long long temp = pw(a, (n >> 1));
  26.     return (temp * temp) % M;
  27. }
  28.  
  29. long long C(long long n, long long k) {
  30.     long long ans = fact[n];
  31.     ans = (ans * pw(fact[k], M - 2)) % M;
  32.     ans = (ans * pw(fact[n - k], M - 2)) % M;
  33.     return ans;
  34. }
  35.  
  36. void count_facts() {
  37.     fact.assign(N, 1);
  38.     for (int i = 1; i < N; i++)
  39.         fact[i] = (fact[i - 1] * i) % M;
  40. }
  41.  
  42. void req_norm() {
  43.     sort(req.begin(), req.end(), [](pair <int, int> l, pair <int, int> r) {
  44.             if (l.first != r.first)
  45.                 return l.first < r.first;
  46.             return l.second > r.second;
  47.          });
  48.  
  49.  
  50.     auto _req = req;
  51.     req.clear();
  52.     vector <int> temp(m + 1, 1e9);
  53.  
  54.     for (int i = m - 1; i >= 0; i--)
  55.         temp[i] = min(temp[i + 1], _req[i].second);
  56.  
  57.     for (int i = 0; i < m; i++)
  58.         if (_req[i].second < temp[i + 1])
  59.             req.push_back(_req[i]);
  60.  
  61.     m = req.size();
  62. }
  63.  
  64. void count_near() {
  65.     vector <pair <int, int> > rreq;
  66.     for (auto e: req)
  67.         rreq.push_back(make_pair(e.second, e.first));
  68.  
  69.     for (int i = 0; i < n - 1; i++) {
  70.         near.push_back(make_pair(-1, -1));
  71.  
  72.         int from = upper_bound(rreq.begin(), rreq.end(), make_pair(i, (int)1e9))
  73.             - rreq.begin();
  74.         int to = upper_bound(req.begin(), req.end(), make_pair(i, (int)1e9)) -
  75.             req.begin() - 1;
  76.  
  77.         if (from == -1 || to == -1 || from >= m || to >= m)
  78.             continue;
  79.         if (i < req[from].first || i >= req[from].second ||
  80.             i < req[to].first || i >= req[to].second)
  81.                 continue;
  82.         fr++;
  83.  
  84.         near[i] = make_pair(from, to);
  85.     }
  86.     fr = n - 1 - fr;
  87. }
  88.  
  89. void dp() {
  90.     vector <vector <int> > d(m + 1, vector <int>(L, 0));
  91.     vector <vector <int> > psum(1, vector <int>(L, 0));
  92.  
  93.     for (int i = 0; i <= min(L - 1, fr); i++)
  94.         d[0][i] = psum[0][i] = C(fr, i);
  95.  
  96.     for (int i = 0; i < n - 1; i++) {
  97.         int from, to;
  98.         tie(from, to) = near[i];
  99.  
  100.         if (from == -1)
  101.             continue;
  102.  
  103.         if (to + 1 == (int)psum.size())
  104.             psum.push_back(psum.back());
  105.  
  106.         for (int j = L - 1; j >= 1; j--) {
  107.             int addo = psum[to + 1][j - 1];
  108.             if (from > 0)
  109.                 addo = (addo + M - psum[from - 1][j - 1]) % M;
  110.             d[to + 1][j] = (d[to + 1][j] + addo) % M;
  111.             psum[to + 1][j] = (psum[to + 1][j] + addo) % M;
  112.         }
  113.     }
  114.  
  115.     /* for (auto x: d) {
  116.         for (int y: x)
  117.             cout << y << ' ';
  118.         cout << endl;
  119.     } */
  120.  
  121.     var = d[m];
  122.  
  123.     /* for (int x: var)
  124.         cout << x << ' ';
  125.     cout << '\n'; */
  126. }
  127.  
  128. void dp1() {
  129.     bitset <L> k2(k);
  130.     vector <vector <vector <int> > > d;
  131.     d.assign(2, vector <vector <int> >(L, vector <int>(L + 1, 0)));
  132.  
  133.     d[1][L - 1][0] = 1;
  134.  
  135.     for (int i = L - 2; i >= 0; i--) {
  136.  
  137.         for (int used = 0; used < L; used++) {
  138.             if (k2[i]) {
  139.                 d[1][i][used + 1] = (d[1][i][used + 1] + d[1][i + 1][used]) % M;
  140.                 d[0][i][used] = (d[0][i][used] + d[1][i + 1][used]) % M;
  141.             }
  142.             else
  143.                 d[1][i][used] = (d[1][i][used] + d[1][i + 1][used]) % M;
  144.  
  145.             d[0][i][used] = (d[0][i][used] + d[0][i + 1][used]) % M;
  146.             d[0][i][used + 1] = (d[0][i][used + 1] + d[0][i + 1][used]) % M;
  147.         }
  148.  
  149.     }
  150.  
  151.     cis.assign(L, 0);
  152.     for (int i = 0; i < L; i++)
  153.         cis[i] = (d[1][0][i] + d[0][0][i]) % M;
  154.  
  155.     /* for (int x: cis)
  156.         cout << x << ' ';
  157.     cout << '\n'; */
  158. }
  159.  
  160. void count_ciss() {
  161.     ciss.assign(L, 0);
  162.     for (int fi = 0; fi < L; fi++) {
  163.         for (int st = 0; st <= fi; st++) {
  164.             int cb = fi - st;
  165.  
  166.             long long v = cis[fi];
  167.             v = (v * C(fi, cb)) % M;
  168.  
  169.             ciss[cb] = (ciss[cb] + v) % M;
  170.         }
  171.     }
  172.  
  173.     /* for (int x: ciss)
  174.         cout << x << ' ';
  175.     cout << '\n'; */
  176. }
  177.  
  178. int dp2(int a, int b) {
  179.     vector <vector <int> > d(a + 2, vector <int>(b + 2, 0));
  180.     d[0][0] = 1;
  181.  
  182.     for (int i = 0; i <= a; i++) {
  183.         for (int j = 0; j <= b; j++) {
  184.             d[i + 1][j + 1] = (d[i + 1][j + 1] + d[i][j]) % M;
  185.             if (j > 0)
  186.                 d[i + 1][j] = (1ll * d[i][j] * j + d[i + 1][j]) % M;
  187.         }
  188.     }
  189.  
  190.     return d[a][b];
  191. }
  192.  
  193. int main() {
  194.     freopen("input.txt", "r", stdin);
  195.     freopen("output.txt", "w", stdout);
  196.     ios_base::sync_with_stdio(false);
  197.  
  198.     count_facts();
  199.  
  200.     cin >> n >> m >> k;
  201.     for (int i = 0; i < m; i++) {
  202.         int from, to;
  203.         cin >> from >> to;
  204.         from--; to--;
  205.         req.push_back(make_pair(from, to));
  206.     }
  207.  
  208.     req_norm();
  209.     count_near();
  210.     dp();
  211.     dp1();
  212.     count_ciss();
  213.  
  214.     for (int cb = 0; cb < L; cb++) {
  215.         for (int up = 0; up <= cb; up++) {
  216.             long long v = dp2(cb, up);
  217.             v = (v * fact[up]) % M;
  218.             v = (v * ciss[cb]) % M;
  219.             v = (v * var[up]) % M;
  220.  
  221.             ans = (ans + v) % M;
  222.         }
  223.     }
  224.  
  225.     cout << ans;
  226.  
  227.     return 0;
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement