#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility>
#include<cmath>
using namespace std;
struct Bomby
{
long long poz;
int pol_prawo=0,pol_lewo=0;
}*tab;
long long silnia(int a)
{
if (a == 0) return 1;
return a* silnia(a - 1);
}
long long kombinacje(int a, int b)
{
return silnia(a) / silnia(b) * (1 / silnia(a - b));
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
int t;
long long p, z;
cin >> t;
long long* cyfry = new long long[t+2]();
tab = new Bomby[t + 2];
vector <pair <long, long> > zasieg;
cyfry[0] = 1;
for (int i = 1; i <= t; i++)
{
cin >> p >> z;
tab[i].poz = p;
if (p - z < 0 && p + z <= pow(10, 18))
zasieg.push_back(make_pair(0, p + z));
else if (p - z < 0 && p + z > pow(10, 18))
zasieg.push_back(make_pair(0,pow(10,18)));
else if (p - z > 0 && p + z > pow(10, 18))
zasieg.push_back(make_pair(p-z,pow(10,18)));
else
zasieg.push_back(make_pair(p-z, p + z));
cyfry[i] = kombinacje(t, i);
}
for (int i = 1; i <= t; i++)
{
for (int x = 1; x <= t; x++)
{
if (tab[x].poz >= zasieg[i-1].first && tab[x].poz <= zasieg[i-1].second)
{
tab[i].pol_prawo++;
if (tab[x].poz < tab[i].poz)
tab[x].pol_lewo++;
}
if (tab[x].poz > zasieg[i-1].second) break;
}
tab[i].pol_prawo--;
}
int n = t-1;
for (int i = 1; i <= t; i++)
{
int polp = tab[i].pol_prawo, poll = tab[i].pol_lewo;
cyfry[1]--;
if(polp>0)
cyfry[2] -= (t - polp);
for (int x = 3; x < t; x++)
{
int k = n;
int b = x;
if (k - b < 1) break;
if (polp == 1)
{
long long s = kombinacje(k, b);
k--;
b--;
while (k-b>=1&&b<=0)
{
s -= kombinacje(k, b);
k--;
b--;
}
cyfry[x] -= s;
}
}
n--;
}
long long wynik = 0;
for (int i = 0; i <= t; i++)
{
wynik += cyfry[i];
wynik %= 1000000007;
}
cout << labs(wynik);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <iostream> #include <vector> #include <queue> #include <algorithm> #include <utility> #include<cmath> using namespace std; struct Bomby { long long poz; int pol_prawo=0,pol_lewo=0; }*tab; long long silnia(int a) { if (a == 0) return 1; return a* silnia(a - 1); } long long kombinacje(int a, int b) { return silnia(a) / silnia(b) * (1 / silnia(a - b)); } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); int t; long long p, z; cin >> t; long long* cyfry = new long long[t+2](); tab = new Bomby[t + 2]; vector <pair <long, long> > zasieg; cyfry[0] = 1; for (int i = 1; i <= t; i++) { cin >> p >> z; tab[i].poz = p; if (p - z < 0 && p + z <= pow(10, 18)) zasieg.push_back(make_pair(0, p + z)); else if (p - z < 0 && p + z > pow(10, 18)) zasieg.push_back(make_pair(0,pow(10,18))); else if (p - z > 0 && p + z > pow(10, 18)) zasieg.push_back(make_pair(p-z,pow(10,18))); else zasieg.push_back(make_pair(p-z, p + z)); cyfry[i] = kombinacje(t, i); } for (int i = 1; i <= t; i++) { for (int x = 1; x <= t; x++) { if (tab[x].poz >= zasieg[i-1].first && tab[x].poz <= zasieg[i-1].second) { tab[i].pol_prawo++; if (tab[x].poz < tab[i].poz) tab[x].pol_lewo++; } if (tab[x].poz > zasieg[i-1].second) break; } tab[i].pol_prawo--; } int n = t-1; for (int i = 1; i <= t; i++) { int polp = tab[i].pol_prawo, poll = tab[i].pol_lewo; cyfry[1]--; if(polp>0) cyfry[2] -= (t - polp); for (int x = 3; x < t; x++) { int k = n; int b = x; if (k - b < 1) break; if (polp == 1) { long long s = kombinacje(k, b); k--; b--; while (k-b>=1&&b<=0) { s -= kombinacje(k, b); k--; b--; } cyfry[x] -= s; } } n--; } long long wynik = 0; for (int i = 0; i <= t; i++) { wynik += cyfry[i]; wynik %= 1000000007; } cout << labs(wynik); return 0; } |
English