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 }