题意:给定10^5以内的n,m求∑组合数(n,i),共10^5组数据。

题解:

定义 S(n, m) = \sum_{i = 0} ^ {m} {n \choose i}S(n,m)=∑​i=0​m​​(​i​n​​),

不难发现 S(n, m) = S(n, m - 1) + {n \choose m}, S(n, m) = 2S(n - 1, m) - {n - 1 \choose m}S(n,m)=S(n,m−1)+(​m​n​​),S(n,m)=2S(n−1,m)−(​m​n−1​​)。

也就是说,如果我们知道 S(n, m)S(n,m),就能以 O(1)O(1) 的代价计算出 S(n - 1, m), S(n, m - 1), S(n + 1, m), S(n, m + 1)S(n−1,m),S(n,m−1),S(n+1,m),S(n,m+1),

可以采用莫队算法。

时间复杂度 O(T \sqrt{MAX})O(T√​MAX​​​)。

我的理解:其中还有一个难点就是O(1)求组合数,首先预处理出所有maxn个阶乘,以及阶乘的逆元(求得过程中因为只涉及乘法加法所以无脑mod即可),然后有一点是

从大到小,n!的逆元=(n+1)!逆元*(n+1)(写出来就懂了,把分母的(n+1)翻上去即可)或者一个一个用费马小定理求,也不会超时。


#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<queue>
#define maxn 100010
#define MOD 1000000007
using namespace std;
int T;
int l,n,m;
int len;
long long a[maxn+1],b[maxn+1];
long long ans[maxn+1];
struct Q{
int L,R,ID,block;
Q(){}
Q(int l,int r,int id):L(l),R(r),ID(id)
{
block=l/len;
}
bool operator <(const Q A)
{
if(block<A.block)return true;
else if(block==A.block&&R<A.R)return true;
return false;
}
}q[maxn+1];
long long powi(long long x,long long y)
{
long long tmp=x;
long long out=1;
while(y)
{
if(y%2==1)
out=tmp*out%MOD;
tmp=tmp*tmp%MOD;
y=y/2;
}
return out;
}
long long C(long long L,long long R)
{
return a[R]*b[L]%MOD*b[R-L]%MOD;
}
int main()
{
scanf("%d",&T);
int cnt=T;
a[0]=1;
for(int i=1;i<=maxn;i++)a[i]=i*a[i-1]%MOD;
b[maxn]=powi(a[maxn],MOD-2);
for(int i=maxn-1;i>=0;i--)b[i]=b[i+1]*(i+1)%MOD;
len=int(sqrt(maxn));
while(T--)
{
scanf("%d%d",&n,&m);
q[cnt-T]=Q(m,n,cnt-T);

}
sort(q+1,q+cnt);
int lt=0,rt=0;
long long anst=1;
for(int i=1;i<=cnt;i++)
{
int l=q[i].L,r=q[i].R;
while(lt>l){anst=(anst-C(lt,rt)+MOD)%MOD;lt--;}
while(rt<r){anst=(2*anst-C(lt,rt)+MOD)%MOD;rt++;}
while(lt<l){anst=(anst+C(lt+1,rt))%MOD;lt++;}
while(rt>r){anst=(anst+C(lt,rt-1))*b[2]%MOD;rt--;}
ans[q[i].ID]=anst;
}
for(int i=1;i<=cnt;i++)
{
printf("%lld\n",ans[i]);
}
}

 

2018年多校第四场第二题 B. Harvest of Apples hdu6333的更多相关文章

  1. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  2. Problem E. Matrix from Arrays(杭电2018年多校第四场+思维+打表找循环节)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6336 题目: 题意:给你一个l个元素的数组a,用题目中的程序构造一个新的矩阵,询问q次,问以(x1,y ...

  3. 2018年多校第三场第一题 A. Ascending Rating hdu6319

    比赛地址:http://acm.hdu.edu.cn/contests/contest_show.php?cid=804 题目编号:第一题 A. Ascending Rating  hdu6319 题 ...

  4. 2019年牛客多校第四场 B题xor(线段树+线性基交)

    题目链接 传送门 题意 给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传 ...

  5. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  6. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  7. 牛客多校第四场sequence C (线段树+单调栈)

    牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...

  8. 2020牛客多校第八场K题

    __int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...

  9. 《学习OpenCV》练习题第四章第二题

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

随机推荐

  1. 背包九讲PDF

    本资料仅限个人学习交流使用,不得用于商业用途. 背包九讲PDF:https://pan.baidu.com/s/17rTxMwCo9iSTOW77yucdXQ   提取码:xbqa

  2. idea使用记录

    1.在工具栏添加工具

  3. 将驱动编译进Linux内核

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  4. es集群数据库~运维相关

    一 数据同步方案  1 ES-JDBC  不能实现删除同步操作.MYSQL如果删除,ES不会删除  2 logstash-input-jdbc  能实现insert update,但是仍然不能实现删除 ...

  5. jQuery mouse and lunbo

    自动轮播 和 鼠标事件var arr = ["images/d.jpg", "images/q.jpg", "images/c.jpg", ...

  6. ImportError: Imageio Pillow plugin requires Pillow, not PIL!

    问题: 解决: 首先确定是否安装了pillow,若没有输入以下命令安装: sudo pip3 install pillow 然后,再跑一边代码,看是否还会出现错误.若还有错误,更新pillow到最新版 ...

  7. # 20175333曹雅坤《Java程序设计》第四周学习总结

    教材学习内容总结 第五章:子类与继承 5.1子类与父类:关键字extends 5.2子类的继承性:如果子类与父类在一个包中,除了private其他都可以继承:如果不在一个包中,则private和友好都 ...

  8. git查日志命令

    git常用命令 1.创建仓库 a.当前目录创建仓库,即把当前目录的文件开始用git管理,该命令会在当前目录下创建一个.git目录 git init b.指定目录创建仓库 git init 目录名 2. ...

  9. Asp.net Mvc 与WebForm 混合开发

      根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与Webform 混合开发,比如前台框架用MVC,后台框架用WebForm.其实要是实现也很简单,如下: (1)在MVC 中使用Web ...

  10. 帆软报表(finereport)间格运算常用公式

    1.1在C3(占比)单元格中直接使用占比公式:=PROPORTION(B3):占比:当前值占总值的比例 1.2 计组内占比注:C2[!0]{A2=$A2},表示C2扩展出来地区相同的单元格.sum(C ...