Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- typedef long long ll;
- const int MOD = (int)1e9 + 7;
- int add(int x, int y)
- {
- x += y;
- if (x >= MOD) return x - MOD;
- return x;
- }
- int sub(int x, int y)
- {
- x -= y;
- if (x < 0) return x + MOD;
- return x;
- }
- int mult(int x, int y)
- {
- return ((ll)x * y) % MOD;
- }
- int bin_pow(int x, int p)
- {
- if (p == 0) return 1;
- if (p == 2 || (p & 1)) return mult(x, bin_pow(x, p - 1));
- return bin_pow(bin_pow(x, p / 2), 2);
- }
- int rev(int x)
- {
- return bin_pow(x, MOD - 2);
- }
- const int N = 200100;
- const int K = 4010;
- const int Z = 2002;
- int n;
- int a[N][2];
- int C[K][K];
- ll b[K];
- int f[2 * K], rf[2 * K];
- int ans = 0;
- void init()
- {
- f[0] = 1;
- for (int i = 1; i < 2 * K; i++)
- f[i] = mult(f[i - 1], i);
- rf[2 * K - 1] = rev(f[2 * K - 1]);
- for (int i = 2 * K - 1; i > 0; i--)
- rf[i - 1] = mult(rf[i], i);
- for (int i = 0; i < K; i++)
- C[i][0] = C[i][i] = 1;
- for (int i = 1; i < K; i++)
- for (int j = 1; j < i; j++)
- C[i][j] = add(C[i - 1][j], C[i - 1][j - 1]);
- return;
- }
- void read()
- {
- /*
- n = 200000;
- for (int i = 0; i < n; i++)
- a[i][0] = a[i][1] = 2000;
- */
- scanf("%d", &n);
- for (int i = 0; i < n; i++)
- for (int j = 0; j < 2; j++)
- scanf("%d", &a[i][j]);
- return;
- }
- void solve(int x, int y)
- {
- /*
- for (int i = -x; i <= y; i++)
- b[Z - i] = add(b[Z - i], C[x + y][x + i]);
- */
- for (int i = -x; i <= y; i++)
- b[Z - i] += C[x + y][x + i];
- return;
- }
- int getC(int n, int k)
- {
- return mult(f[n], mult(rf[k], rf[n - k]));
- }
- int main()
- {
- // freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- init();
- read();
- for (int i = 0; i < n; i++)
- solve(a[i][0], a[i][1]);
- for (int i = -Z; i <= Z; i++)
- b[Z + i] %= MOD;
- for (int i = -Z; i <= Z; i++)
- ans = add(ans, mult(b[Z + i], b[Z - i]));
- for (int i = 0; i < n; i++)
- ans = sub(ans, getC(2 * (a[i][0] + a[i][1]), 2 * a[i][0]));
- if (ans & 1) ans += MOD;
- ans /= 2;
- printf("%d\n", ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement