HDU 6333 Harvest of Apples

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define ms(arr,a) memset(arr,a,sizeof arr)
#define debug(x) cout<<"< "#x" = "<<x<<" >"<<endl
const int maxn=1e5+5;
const int mod=1e9+7;
int fac[maxn],inv_fac[maxn];
int quick_pow(int a,int n)
{
    int ret=1;
    while(n)
    {
        if(n&1)ret=1LL*ret*a%mod;
        a=1LL*a*a%mod;
        n>>=1;
    }
    return ret;
}
int inv2=quick_pow(2,mod-2);
void init_fac()
{
    fac[0]=inv_fac[0]=1;
    for(int i=1;i<maxn;++i)
    {
        fac[i]=1LL*fac[i-1]*i%mod;
        inv_fac[i]=quick_pow(fac[i],mod-2);
    }
}
int block_size=316;
struct Query
{
    int a,b,id,block;
    Query(){}
    Query(int x,int y,int z):a(x),b(y),id(z){block=a/block_size;}
    bool operator < (const Query q)const{return block<q.block||(block==q.block&&b<q.b);}
}q[maxn];
int ans[maxn];
inline int c(int n,int m)
{
    return 1LL*fac[n]*inv_fac[m]%mod*inv_fac[n-m]%mod;
}

int main()
{
    //freopen("1.txt","w",stdout);
    init_fac();
    int T;scanf("%d",&T);
    for(int i=1;i<=T;++i)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        q[i]=Query(n,m,i);
    }
    sort(q+1,q+T+1);
    int& ans1=ans[q[1].id];
    for(int i=0;i<=q[1].b;++i)ans1=(ans1+c(q[1].a,i))%mod;
    for(int i=2;i<=T;++i)
    {
        int n=q[i-1].a,m=q[i-1].b,an=ans[q[i-1].id];
        while(q[i].b<m)an=(an-c(n,m--)+mod)%mod;
        while(q[i].a>n)an=(2*an%mod-c(n++,m)+mod)%mod;
        while(q[i].b>m)an=(an+c(n,++m))%mod;
        while(q[i].a<n)an=1LL*(an+c(--n,m))*inv2%mod;
        ans[q[i].id]=an;
    }
    for(int i=1;i<=T;++i)printf("%d
",ans[i]);
}
原文地址:https://www.cnblogs.com/maoruimas/p/9635904.html