• 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
    ",ans[i]);
        }
        
        return 0;
    }
    
  • 相关阅读:
    Scrapy 使用 LinkExtractor 提取链接和使用 Exporter 导出数据
    Scrapy 使用 Item 封装数据、使用 Item Pipline处理数据
    XPath 和 CSS
    Scrapy 中的 Request 对象和 Respionse 对象
    Scrapy 框架结构及工作原理
    Scrapy 常用的shell执行命令
    mui html5 plus
    《C++ Primer》读书笔记—第二章 变量和基本类型
    eclipse+maven搭建ssm框架
    unique_ptr 智能指针(C++11)
  • 原文地址:https://www.cnblogs.com/2014slx/p/9407232.html
Copyright © 2020-2023  润新知