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 ...
随机推荐
- ElasticSearch Index操作源码分析
ElasticSearch Index操作源码分析 本文记录ElasticSearch创建索引执行源码流程.从执行流程角度看一下创建索引会涉及到哪些服务(比如AllocationService.Mas ...
- 20155324《网络对抗》Exp06 信息搜集与漏洞扫描
20155324<网络对抗>Exp06 信息搜集与漏洞扫描 实践内容 各种搜索技巧的应用 DNS IP注册信息的查询 基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点 ...
- rem是怎么计算的(转载)
「rem」是指根元素(root element,html)的字体大小,从遥远的 IE6 到版本到 Chrome 他们都约好了,根元素默认的 font-size 都是 16px. rem是通过根元素进行 ...
- combine_lat_dirs.sh
#!/bin/bash # Copyright 2018 Jarvan Wang Apache 2.0. # Copyright 2016 Xiaohui Zhang Apache 2.0. ...
- Windows10配置JDK环境变量
一. 系统和JDK版本 系统:Windows10 JDK版本:1.8 二. 配置步骤 1. 右键单击“我的电脑” >> 属性 >> 高级系统设置 2. 环境变量 3. 系统变量 ...
- 【题解】魔板—洛谷P1275。
话说好久没更博了. 最近学了好多知识懒的加进来了. 有幸认识一位大佬. 让我有了继续更博的兴趣. 但这是一个旧的题解. 我在某谷上早就发过的. 拿过来直接用就当回归了吧. 其实这道题有一个特别关键的思 ...
- spring cloud 学习笔记(1)
SpringCloud + Eureka / Nacos git:https://github.com/huanmsf/springCloudLearn.git 项目目录: 父pom: <?xm ...
- python实现压缩当前文件夹下的所有文件
import os import zipfile def zipDir(dirpath, outFullName): ''' 压缩指定文件夹 :param dirpath: 目标文件夹路径 :para ...
- input 上报流程图
input 上报流程图 http://blog.chinaunix.net/uid-28320320-id-3389196.html
- js 获取 时间戳的三种方法
new Date() *1 自动数据类型转换为数字 new Date().getTime() Date.now();