#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; } |