HDU 6333 Problem B. Harvest of Apples 莫队.....

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

题意:n个不相同的数取最多为m的取法数;

NTT  多了一个log  好像直接测就T了  
赛后了解正解为莫队时  G++;

**********tricks****
a[i].r a[i].1 输入. 分析组合数的l r 与 n m的状态转移关系;
确定初始l r 值;
*/


#include
#define ll long long
using namespace std;

const int maxn=1e5+5;
const int mod=1e9+7;

ll fac[maxn],inv[maxn];

ll qpow(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1) ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans;
}

ll C(int n,int k){ return fac[n]*inv[k]%mod *inv[n-k]%mod;}

void init(){
    fac[0]=fac[1]=1;
    for(int i=2;i=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
}

int pos[maxn];

struct node{
    int l,r,id;
    bool operator <(const node& a) const{
        if(pos[l]==pos[a.l]) return ra[i].l){
            res=(res-C(r,l)+mod)%mod;//s(n,m-1)=s(n,m)-c(n,m);
            l--;
        }
        while(la[i].r) {
            res=((res+C(r-1,l))%mod)*inv2%mod;//s(n-1,m)=1/2*(s(n,m)+c(n-1,m));
            r--;
        }
        ans[a[i].id]=res;
    }
    for(int i=1;i<=t;i++) printf("%lld\n",ans[i]);
    return 0;
}

 

你可能感兴趣的:(ACM--莫队--数列分块)