#include<cstring> #include<cstdlib> #include<algorithm> #include<utility> using pii = std::pair<int, int>; constint ha = 1000000007; using ll = longlong; ll (ll a, ll b){ ll ans = 1, res = a; while(b) { if(1LL & b) ans = ans * res % (ll)ha; res = res * res % (ll)ha; b >>= 1; } return ans; } ll inv(ll x){ return pow_mod(x, ha - 2); }
ll fac[10005], ifac[10005]; voidprocess(){ int n = 10000; fac[0] = 1; for(int i = 1; i <= n; i ++) { fac[i] = (fac[i - 1] * (ll(i))) % (ll)ha; } ifac[n] = inv(fac[n]); for(int i = n - 1; i >= 0; i --) { ifac[i] = ifac[i + 1] * (ll(i + 1)) % (ll)ha; } } ll C(int x, int y){ ll ret = fac[x]; ret = ret * ifac[x - y] % (ll)ha; ret = ret * ifac[y] % (ll)ha; return ret; }
pii P[200005]; int d[4005][4005]; int n; intdp(){ #ifdef LOCAL puts("11111"); fflush(stdout); #endif for(int i = 1; i <= n; i ++) { int x = P[i].first, y = P[i].second; d[2000 - x][2000 - y] ++; } for(int dis = 1; dis <= 8000; dis ++) { for(int i = std::max(0, dis - 4000); i <= std::min(4000, dis); i ++) { int j = dis - i; if(i > 0) d[i][j] = (d[i][j] + d[i - 1][j]) % ha; if(j > 0) d[i][j] = (d[i][j] + d[i][j - 1]) % ha; } } #ifdef LOCAL puts("Gou!"); fflush(stdout); #endif int ans = 0; for(int i = 1; i <= n; i ++) { int x = P[i].first, y = P[i].second; ans = (ans + d[x + 2000][y + 2000]) % ha; ans = (ans - C(2 * x + 2 * y, 2 * x) + ha) % ha; } staticconst ll inv_2 = 500000004; ans = (((ll(ans)) * inv_2) % (ll)ha); return ans; }
intmain(){ scanf("%d", &n); for(int i = 1; i <= n; i ++) { scanf("%d%d", &P[i].first, &P[i].second); } process(); printf("%dn", dp()); return0; }
近期评论