hdu 6333 Harvest of Apples

题目:点击打开链接
题意:给出T组n和m(1<=T<=1e5, 1<=m<=n<=1e5)。求\sum_{i=0}^{m}C_{n}^{i}

分析:

法一:S(l,r)=S(l,r+1)-C(l,r+1)     
        =S(l,r-1)+C(l,r);     
        =2*S(l-1,r)-C(l-1,r)  (由杨辉三角得出,利用前缀和组合数性质)
        =(S(l+1,r)+C(l,r))/2; 

利用莫队离线处理,预处理一下,即可O(1)转移。

法二:利用杨辉三角的性质,分段打表,参考点击打开链接。

代码:

#pragma comment(linker, "/STACK:102400000,102400000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define debug test
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define rep(i,a,n) for (int i=a;i=a;i--)
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
#define eps 1e-10
#define PI acos(-1.0)
typedef pair PII;
const ll mod = 1e9+7;
const int N = 1e5+2;

ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qp(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int to[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

ll f[N],inv[N],ans[N],t,bk;
void init() {
    f[0]=f[1]=1;
    for(int i=2;i=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
}

ll C(ll n,ll m) {
    if(nq[i].l) {
            s = (s+C(cl-1,cr))%mod*inv[2]%mod;
            cl--;
        }
        while(crq[i].r) {
            s = (s-C(cl,cr)+mod)%mod;
            cr--;
        }
        ans[q[i].id]=s;
    }
    for(int i=1;i<=t;i++) cout<>t;
    init();
    bk=sqrt(N);
    for(int i=1;i<=t;i++) {
        cin>>q[i].l>>q[i].r;
        q[i].id=i;
    }
    mo();
    return 0;
}

 

你可能感兴趣的:(莫队,杨辉三角,莫队,离线,杨辉三角)