计算C(n,0)+C(n,1)+...+C(n,m)--Problem B. Harvest of Apples

http://acm.hdu.edu.cn/showproblem.php?pid=6333

四个while的顺序不能变,不知道为什么

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int N=1e5+10;
ll block;
ll fac[N],inv[N];
ll L,R,now;
ll ans[N];
ll rev2;
ll qpow(ll b,int n)
{
    ll res=1;
    while(n)
    {
        if(n&1) res=res*b%mod;
        b = b*b%mod;
        n>>=1;
    }
    return res;
}
struct node
{
    int l,r,id;
};
node q[N];
bool cmp(node a,node b)
{
    if(a.l/block!=b.l/block)
        return a.l/block<b.l/block;
    return a.r<b.r;
}
void init()
{
    rev2=qpow(2,mod-2);
    inv[0]=fac[0]=1;
    inv[1]=1;
    for(int i=1;i<N;i++)
        fac[i]=fac[i-1]*i%mod;
    inv[1]=1;
    for(int i=2;i<N;i++)
        inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
    inv[0]=1;
    for(int i=1;i<N;i++)
        inv[i]=inv[i-1]*inv[i]%mod;
}
ll C(int n,int m)
{
    return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
void updateNL(int l,int r)
{
    now=(2*now%mod-C(l,r)+mod)%mod;
}
void updateML(int l,int r)
{
    now=(now+C(l,r))%mod;
}
void updateMR(int l,int r)
{
    now=(now-C(l,r)+mod)%mod;
}
void updateNR(int l,int r)
{
    now=(now+C(l,r))%mod*rev2%mod;
}
int main()
{
    init();
    int t,i;
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
        scanf("%d%d",&q[i].l,&q[i].r);
        q[i].id=i;
    }
    block=(int)sqrt(1.0*N);
    sort(q+1,q+1+t,cmp);
    L=1;R=1;
    now=2;//S(1,1)=2
    for(i=1;i<=t;i++)
    {
        while(L<q[i].l)//S(n+1,m)=2S(n,m)-C(n,m),知道S(n,m),求S(n+1,m)
        {
            //addN(++L,R);
            updateNL(L,R);
            L++;
        }
        while(R<q[i].r)//S(n,m+1)=S(n,m)+C(n,m+1),知道S(n,m),求S(n,m+1)
        {
            R++;
            updateML(L,R);
            //addM(L,++R);
        }
        while(L>q[i].l)//S(n-1,m)=(S(n,m)+C(n-1,m))/2,知道S(n,m),求S(n-1,m)
        {
            L--;
            updateNR(L,R);
            //delN(L--,R);
        }
        while(R>q[i].r)//S(n,m-1)=S(n,m)-C(n,m),知道S(n,m),求S(n,m-1)
        {
            //delM(L,R--);
            updateMR(L,R);
            R--;
        }
        ans[q[i].id]=now;
    }
    for(i=1;i<=t;i++)
        printf("%lld\n",ans[i]);
}

猜你喜欢

转载自blog.csdn.net/qq_37891604/article/details/81462045
今日推荐