Problem B. Harvest of Apples

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 50;
typedef long long ll;
const ll mod = 1e9 + 7;
ll fac[maxn], sing[maxn], inv[maxn];
void init(int n)
{
    fac[0] = sing[0] = inv[0] = fac[1] = sing[1] = inv[1] = 1;
    for(int i = 2; i <= n; i++)
    {
        fac[i] = fac[i - 1] * i % mod;
        sing[i] = (mod - mod / i) * sing[mod % i] % mod;
        inv[i] = inv[i - 1] * sing[i] % mod;
    }
}
ll C(int n, int m)
{
    ll res =  fac[n]* inv[m] % mod * inv[n - m] % mod;
   // printf("%d %d %lld\n",n, m, res);
    return res;
}
struct Seg
{
    int l, r, belong, id;
}seg[maxn];
ll ans[maxn];
bool cmp(Seg A, Seg B)
{
    if(A.belong == B.belong) return A.r < B.r;
    return A.l < B.l;
}
int main()
{
    init(1e5 + 5);
    int block = sqrt(1e5);
    int T; scanf("%d", &T);
    for(int p = 1; p <= T; p++)
    {
        scanf("%d %d", &seg[p].l, &seg[p].r);
        seg[p].belong = seg[p].l / block;
        seg[p].id = p;
    }
    sort(seg + 1, seg + T + 1, cmp);
    int l = 0, r = 0;
    ll res = 1;
    for(int i = 1; i <= T; i++)
    {
        while(l < seg[i].l)
        {
            res = (res * 2LL % mod + mod - C(l, r)) % mod;
            l++;
        }
        while(l > seg[i].l)
        {
            l--;
            res = (res + C(l, r)) * sing[2] % mod;
        }
        while(r < seg[i].r)
        {
            r++;
            res = (res + C(l, r)) % mod;
        }
        while(r > seg[i].r)
        {
            res = (res + mod - C(l, r)) % mod;
            r--;
        }
        ans[seg[i].id] = res;
       // printf("%lld\n", ans[seg[i].id]);
    }
    for(int i = 1; i <= T; i++)
    {
        printf("%lld\n", ans[i]);
    }
    return 0;
}
Code

相关文章: