2018年多校第四场第二题 B. Harvest of Apples hdu6333
题意:给定10^5以内的n,m求∑组合数(n,i),共10^5组数据。
题解:
定义 S(n, m) = \sum_{i = 0} ^ {m} {n \choose i}S(n,m)=∑i=0m(in),
不难发现 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)+(mn),S(n,m)=2S(n−1,m)−(mn−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的更多相关文章
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- Problem E. Matrix from Arrays(杭电2018年多校第四场+思维+打表找循环节)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6336 题目: 题意:给你一个l个元素的数组a,用题目中的程序构造一个新的矩阵,询问q次,问以(x1,y ...
- 2018年多校第三场第一题 A. Ascending Rating hdu6319
比赛地址:http://acm.hdu.edu.cn/contests/contest_show.php?cid=804 题目编号:第一题 A. Ascending Rating hdu6319 题 ...
- 2019年牛客多校第四场 B题xor(线段树+线性基交)
题目链接 传送门 题意 给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- 2020牛客多校第八场K题
__int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...
- 《学习OpenCV》练习题第四章第二题
#include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...
随机推荐
- 新系统添加sshkey/pexpect基本使用
Ansible密码认证 //配置Inventory [db] 10.10.10.12 10.10.10.162 [db:vars] #给db组下的主机设置变量 ansible_ssh_user=&qu ...
- 并发编程之wait()、notify()
前面的并发编程之volatile中我们用程序模拟了一个场景:在main方法中开启两个线程,其中一个线程t1往list里循环添加元素,另一个线程t2监听list中的size,当size等于5时,t2线程 ...
- 20155324 实验5 MSF基础应用
20155324 实验5 MSF基础应用 ms08_067 用search命令,搜索与ms08_067相关的模块,如图: 服务器信息块(SMB)是一个网络文件共享协议,它允许应用程序和终端用户从远端的 ...
- javascript浏览器事件
1. Js浏览器对象层级结构:Window 窗口对象(location地址对象.document文档对象(Form表单对象(表单控件))) 2. Window对象属性: 名称 描述 documen ...
- ubuntu 安装 lamp
链接: http://www.cnblogs.com/CheeseZH/p/4694135.html
- centos7 安装软件指南
1. 安装Scrapy: 首先确保依赖已经安装: yum groupinstall -y development tools yum install -y epel-release libxslt-d ...
- 【转载】大白话Docker入门(一)
原文:https://yq.aliyun.com/articles/63035 随着docker现在越来越热门,自己也对docker的好奇心也越来越重,终于忍不住利用了一些时间把docker学习一遍. ...
- Recon ASRC Conference
场景 ASRC漏洞挖掘 方法论 1.Brands https://www.crunchbase.com/ https://en.wikipedia.org Footers & about us ...
- c++ Qt向PHP接口POST文件流
Qt调用PHP写的接口,向其传递图片文件,并保存在服务器. 二进制文件无法直接传递,Qt采用Base64进行编码发送,PHP解码保存为文件. 注意:PHP收到数据之后会将POST过来的数据中的加号(+ ...
- 020_Linux的孤儿进程与僵尸进程(Unix系统编程)
1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上 ...