Problem B. Harvest of Apples

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

题意:求c(n,0)到c(n,m)的和t组数据

每次累加一定会超时

Problem B. Harvest of Apples_第1张图片

得到公式s(n,m)=s(n-1,m)-c(n-1,m);

用莫队算法处理t组查询

#include 
#include 
#include 
#include 
#define LL long long
using namespace std;
const int mod=1e9+7;
struct node
{
    LL l,r;
    int id;
} a[100003];
LL pp=500;//分块
int t;
LL fac[100003],inv[100003];//fac阶乘,inv阶乘的逆元
LL ans[100003];//答案
LL num=1,p;//p是2的逆元
bool cmp(node x,node y)//排序
{
    LL xl=x.l/pp;
    LL yl=y.l/pp;
    if(xl==yl)//在一个块
        return x.ra[i].r)
        {
            num=(num-fac[n]*inv[m]%mod*inv[n-m]%mod+mod)%mod;//减得时候先加一个mod再取余防止是负数
            m--;
        }
        while(n>a[i].l)
        {
            num=(num+fac[n-1]*inv[m]%mod*inv[n-1-m]%mod)*p%mod;
            n--;
        }
        ans[a[i].id]=num%mod;
    }
}
int main()
{
    scanf("%d",&t);
    for(int i=0; i=1;i--)
    {
        inv[i]=qpow(fac[i],mod-2);
    }
    modui();
    for(int i=0; i

 

你可能感兴趣的:(莫队)