cheater2k

BBQ Hard - AtCoder Grand Contest 001

Nov 22nd, 2017
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 200010;
  5. const int offset = 2010;
  6. const int md = 1e9 + 7;
  7.  
  8. int n;
  9. int a[N], b[N];
  10. vector<int> _get[offset + offset];
  11. int f[offset + offset][offset + offset];
  12. int upd[offset + offset][offset + offset];
  13. int ans;
  14. int fact[N], inv[N];
  15.  
  16. void add(int &x, int y) { x += y; x %= md; if(x < 0) x += md; }
  17.  
  18. int pw(int a, int b) {
  19.     int res = 1;
  20.     for(int i = 0; (1LL << i) <= b; ++i) {
  21.         if (b & (1LL << i)) res = 1LL * res * a % md;
  22.         a = 1LL * a * a % md;
  23.     }
  24.     return res;
  25. }
  26.  
  27. int main() {
  28.     scanf("%d", &n);
  29.     for(int i = 1; i <= n; ++i) {
  30.         scanf("%d%d", &a[i], &b[i]);
  31.         _get[a[i] + offset].push_back(b[i] + offset);
  32.         upd[-a[i] + offset][-b[i] + offset]++;
  33.     }
  34.  
  35.     for(int x = 0; x < offset + offset; ++x) {
  36.         for(int y = 0; y < offset + offset; ++y) {
  37.             if(x > 0) add(f[x][y], f[x - 1][y]);
  38.             if(y > 0) add(f[x][y], f[x][y - 1]);
  39.             if(upd[x][y]) add(f[x][y], upd[x][y]);
  40.         }
  41.         for (int y : _get[x]) add(ans, f[x][y]);
  42.     }
  43.  
  44.     fact[0] = 1; for(int i = 1; i < N; ++i) fact[i] = 1LL * fact[i-1] * i % md;
  45.     for(int i = 0; i < N; ++i) inv[i] = pw(fact[i], md - 2);
  46.  
  47.     for(int i = 1; i <= n; ++i) {
  48.         int A = a[i] * 2, B = b[i] * 2;
  49.         add(ans, md - (1LL * fact[A + B] * (1LL * inv[A] * inv[B] % md) % md));
  50.     }
  51.     ans = 1LL * ans * pw(2, md - 2) % md;
  52.  
  53.     printf("%d\n", ans);
  54. }
Add Comment
Please, Sign In to add comment