HDU - 6333 Harvest of Apples (莫队)

题目链接

题意:给你T组询问,每组询问有两个值n,m,让你输出C(n,0)+C(n,1)+...+C(n,m-1)+C(n,m)的值。(1<=T,n,m<=1e5)

由于T的值太大,所以直接算会超时。

考虑莫队算法:

首先要有个预备知识:

S(n,m)=S(n,m-1)+C(n,m)=2S(n-1,m)-C(n-1,m),S(n,m)=\sum_{i=0}^{m}C(n,i)

这样,知道S(n,m-1)的值,就能在O(1)的时间算出S(n,m)的值了。可以按照m的大小分块,把m,n作为左右下标,来回跳就行了。

#include
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int SQRTN=sqrt(N)+10;
const ll mod=1e9+7.5;
int in[N];
ll ans[N],fact[N],inv[N],invfact[N];
struct query
{
    int i;
    ll n,m;
    bool operator<(const query& b)
    {
        return in[m]==in[b.m]?(in[m]&1?n>b.n:nqr[i].m)sum=(sum-C(n,m))%mod,--m;
        while(nqr[i].n)sum=(sum+C(n-1,m))*inv[2]%mod,--n;
        ans[qr[i].i]=(sum+mod)%mod;
    }
    for(int i=0; i

 

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