hdu多校第4场 B Harvest of Apples(莫队)

Posted 2014>

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu多校第4场 B Harvest of Apples(莫队)相关的知识,希望对你有一定的参考价值。

Problem B. Harvest of Apples

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1600    Accepted Submission(s): 604


Problem Description
There are n apples on a tree, numbered from 1 to n.
Count the number of ways to pick at most m apples.
 

Input
The first line of the input contains an integer T (1≤T≤105) denoting the number of test cases.
Each test case consists of one line with two integers n,m (1≤m≤n≤105).
 

Output
For each test case, print an integer representing the number of ways modulo 109+7.
 

Sample Input
2
5 2
1000 500
 

Sample Output
16
924129523
 

Source
2018 Multi-University Training Contest 4
 

Recommend
chendu   |   We have carefully selected several similar problems for you:  6343 6342 6341 6340 6339 

求C(n,0)+C(n,1)+C(n,2)+.....+C(n,m);

设S(n,m)=C(n,0)+C(n,1)+C(n,2)+.....+C(n,m);

 

第一个式子易得,第二个式子:杨辉三角的 n,m=(n-1,m)+(n-1,m-1)

那么就是这一行等于上一行的都用了2次,只有第最后一个用了一次

所以减去c(n-1,m)

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
#define ll long long
const int maxn=1e5+7;
ll jiecheng[maxn],inv[maxn];
ll ans[maxn];
int block;
ll qsm(ll a,ll b)
{
    ll ans=1;
    while(b){
        if(b&1)
            ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
void init()
{
    jiecheng[1] = 1;
    for(int i = 2; i < maxn; i++)
        jiecheng[i] = jiecheng[i-1] * i % mod;
    for(int i = 1; i < maxn; i++)
        inv[i] = qsm(jiecheng[i], mod-2);
}
struct node{
    int l,r;
    int i;
}modui[maxn];
bool cmp(node a,node b)
{
    if(a.l/block==b.l/block)
        return a.r<b.r;
    return a.l<b.l;
}
ll C(ll n,ll m)
{
    
    if(m == 0 || m == n) return 1;
    ll ans=1;
    ans=(jiecheng[n]*inv[m])%mod*inv[n-m];
    ans=ans%mod;
    return ans;
}
int main()
{
    init();
    block = sqrt(maxn);
    int t;
    scanf("%d",&t);
    for(int i=0;i<t;i++)
    {
        scanf("%d%d",&modui[i].l,&modui[i].r);
        modui[i].i=i;
    }
    sort(modui,modui+t,cmp);
    int l=1,r=0;
    int sum=1;
    for(int i = 0; i < t; i++)
    {
        while(l < modui[i].l) sum = (2 * sum - C(l++, r) + mod) % mod;
        while(l > modui[i].l) sum = ((sum + C(--l, r))*inv[2]) % mod;
        while(r < modui[i].r) sum = (sum + C(l, ++r)) % mod;
        while(r > modui[i].r) sum = (sum - C(l, r--) + mod) % mod;
        ans[modui[i].i] = sum;
    }
    for(int i=0;i<t;i++)
    {
        printf("%lld\\n",ans[i]);
    }
    
    return 0;
}

 

以上是关于hdu多校第4场 B Harvest of Apples(莫队)的主要内容,如果未能解决你的问题,请参考以下文章

2017多校第7场 HDU 6128 Inverse of sum 推公式或者二次剩余

2017多校第6场 HDU 6105 Gameia 博弈

2018多校第6场 1013 hdu6373 Pinball

2017多校第8场 HDU 6138 Fleet of the Eternal Throne AC自动机或者KMP

2018 HDU多校第三场赛后补题

hdu多校第4场E. Matrix from Arrays HDU 二维前缀和