Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 200010;
- const int offset = 2010;
- const int md = 1e9 + 7;
- int n;
- int a[N], b[N];
- vector<int> _get[offset + offset];
- int f[offset + offset][offset + offset];
- int upd[offset + offset][offset + offset];
- int ans;
- int fact[N], inv[N];
- void add(int &x, int y) { x += y; x %= md; if(x < 0) x += md; }
- int pw(int a, int b) {
- int res = 1;
- for(int i = 0; (1LL << i) <= b; ++i) {
- if (b & (1LL << i)) res = 1LL * res * a % md;
- a = 1LL * a * a % md;
- }
- return res;
- }
- int main() {
- scanf("%d", &n);
- for(int i = 1; i <= n; ++i) {
- scanf("%d%d", &a[i], &b[i]);
- _get[a[i] + offset].push_back(b[i] + offset);
- upd[-a[i] + offset][-b[i] + offset]++;
- }
- for(int x = 0; x < offset + offset; ++x) {
- for(int y = 0; y < offset + offset; ++y) {
- if(x > 0) add(f[x][y], f[x - 1][y]);
- if(y > 0) add(f[x][y], f[x][y - 1]);
- if(upd[x][y]) add(f[x][y], upd[x][y]);
- }
- for (int y : _get[x]) add(ans, f[x][y]);
- }
- fact[0] = 1; for(int i = 1; i < N; ++i) fact[i] = 1LL * fact[i-1] * i % md;
- for(int i = 0; i < N; ++i) inv[i] = pw(fact[i], md - 2);
- for(int i = 1; i <= n; ++i) {
- int A = a[i] * 2, B = b[i] * 2;
- add(ans, md - (1LL * fact[A + B] * (1LL * inv[A] * inv[B] % md) % md));
- }
- ans = 1LL * ans * pw(2, md - 2) % md;
- printf("%d\n", ans);
- }
Add Comment
Please, Sign In to add comment