zoukankan      html  css  js  c++  java
  • hdu-6333-莫队

    Problem B. Harvest of Apples

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


    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 (1T105) denoting the number of test cases.
    Each test case consists of one line with two integers n,m (1mn105).
     
    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
     
      经过观察可以发现,设S(m,n)=C(0,n)+C(1,n)+.....+C(m,n)的话,S(m,n+1)=2*S(m,n)-C(m,n) , S(m,n-1)=(S(m,n)+C(m,n-1))/2。
      S(m-1,n)=S(m,n)-C(m,n) ,S(m+1,n)=S(m,n)+C(m+1,n),也就是说我们能在O(1)求出来这四个式子,这样就可以用莫队处理了。
    分块的时候我错把 q[i].m/M写成了 i/M导致一直T ,是对mi所在的块作为关键字而不是输入的次序。
      
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long 
     4 #define eps 1e-6
     5 #define mod 1000000007
     6 //LL mod=1e9+7;
     7 const int maxn=100000+5;
     8 LL len,p[maxn]={1,1},inv[maxn]={0,1},p_inv[maxn]={1,1},ans[maxn];
     9 int t;
    10 struct Query{
    11     LL n,m,blo;
    12     int id;
    13     bool operator<(const Query&C)const{
    14         if(blo==C.blo) return n<C.n;
    15         return blo<C.blo;    
    16     }
    17 }q[maxn];
    18 LL cal(LL a,LL b)  
    19 {
    20     if(b>a)
    21         return 0;
    22     return p[a]*p_inv[b]%mod*p_inv[a-b]%mod;
    23 }
    24 int main(){
    25     int n,m,i,j,k;
    26     len=sqrt(maxn);
    27     for(i=2;i<=100000;++i){
    28     p[i]=p[i-1]*i%mod;
    29     inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    30     p_inv[i]=p_inv[i-1]*inv[i]%mod;
    31     }
    32     scanf("%d",&t);
    33     for(i=1;i<=t;++i){
    34         scanf("%lld %lld",&q[i].n,&q[i].m);
    35         q[i].id=i;
    36         q[i].blo=q[i].m/len;
    37     }
    38     sort(q+1,q+1+t);
    39     int L=0,R=1;
    40     LL res=1;
    41     for(i=1;i<=t;++i){
    42         while(L<q[i].m){
    43             res=(res+cal(R,++L))%mod;
    44         }
    45         while(L>q[i].m){
    46             res=(res+mod-cal(R,L--))%mod;
    47         }
    48         while(R<q[i].n){
    49             res=(res*2+mod-cal(R++,L))%mod;
    50         }
    51         while(R>q[i].n){
    52             res=(res+cal(--R,L))%mod*inv[2]%mod;
    53         }
    54         ans[q[i].id]=res;
    55     }
    56     for(i=1;i<=t;++i)printf("%lld
    ",ans[i]);
    57     return 0;
    58 }
     
  • 相关阅读:
    LINUX重启MYSQL的命令
    如何在linux下实现mysql数据库每天自动备份
    mysql 2013错误解决
    mysql按年度、季度、月度、周、日统计查询的sql语句
    MySQL 时间戳(Timestamp)函数
    jQuery 选择器大全总结
    使用Git的Push出现rejected
    js实现分页的几个源码,看完基本就懂了
    Get,Post请求中文乱码问题有效解决方法
    web应用中文乱码问题的原因分析
  • 原文地址:https://www.cnblogs.com/zzqc/p/9431991.html
Copyright © 2011-2022 走看看