A - Problem A. Integers Exhibition

留坑。

 

B - Problem B. Harvest of Apples

题意:计算$\sum_{i = 0}^{i = m}C(n, i)$

思路:由$sum_{i = 0}^{i = m}C(n,i)$可以得到$sum_{i = 0}^{i = m + 1}C(n,i)$以及$sum_{i = 0}^{i = m}C(n + 1,i)$然后用莫对算法求解

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 
 7 const ll MOD = 1e9 + 7;
 8 const int maxn = 1e5 + 10;
 9 
10 int unit;
11 ll inv[maxn];
12 ll invfac[maxn];
13 ll fac[maxn];
14 ll ans[maxn];
15 int n, m;
16 
17 struct node{
18     int l, r, id;
19     inline node(){}
20     inline node(int l, int r, int id) :l(l), r(r), id(id){}
21     inline bool operator < (const node &b) const
22     {
23         if(l / unit != b.l / unit)    return l / unit < b.l / unit;
24         else return r < b.r;
25     }
26 }arr[maxn];
27 
28 inline void Init()
29 {
30     fac[0] = invfac[0] = 1;
31     fac[1] = inv[1] = invfac[1] = 1;
32     for(int i = 2; i < maxn; ++i)
33     {
34         fac[i] = fac[i - 1] * i % MOD;
35         inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD;
36         invfac[i] = invfac[i - 1] * inv[i] % MOD;
37     }
38 }
39 
40 inline ll cal(int a, int b)
41 {
42     ll res = fac[a] * invfac[b] % MOD * invfac[a - b] % MOD;
43     return res;
44 }
45 
46 inline void work()
47 {
48     ll tmp = 0;
49     for(int i = 0; i <= arr[1].r; ++i)
50     {
51         tmp = (tmp + cal(arr[1].l, i)) % MOD;
52     }
53     ans[arr[1].id] = tmp;
54     int L = arr[1].l, R = arr[1].r;
55     for(int i = 2; i <= n; ++i)
56     {
57         while(L < arr[i].l)
58         {
59             tmp = (tmp * 2 % MOD- cal(L++, R) + MOD) % MOD;
60         }
61         while(L > arr[i].l)
62         {
63             tmp = (tmp + cal(--L, R) + MOD) % MOD * inv[2] % MOD;
64         }
65         while(R < arr[i].r)
66         {
67             tmp = (tmp + cal(L, ++R)) % MOD;
68         }
69         while(R > arr[i].r)
70         {
71             tmp = (tmp - cal(L, R--) + MOD) % MOD;
72         }
73         ans[arr[i].id] = tmp;
74     }
75 }
76 
77 int main()
78 {
79     Init();
80     scanf("%d", &n);
81     for(int i = 1; i <= n; ++i)
82     {
83         scanf("%d %d", &arr[i].l, &arr[i].r);
84         arr[i].id = i;
85     }
86     unit = (int)sqrt(n);
87     sort(arr + 1, arr + 1 + n);
88     work();
89     for(int i = 1; i <= n; ++i)
90     {
91         printf("%lld\n", ans[i]);
92     }
93     return 0;
94 }
View Code

相关文章:

  • 2022-01-16
  • 2022-02-09
  • 2021-10-31
  • 2022-12-23
  • 2021-11-13
  • 2018-07-24
猜你喜欢
  • 2021-07-18
  • 2021-08-06
  • 2021-06-13
  • 2021-10-14
  • 2022-02-17
  • 2021-12-03
  • 2021-08-22
相关资源
相似解决方案