hdu_5145_NPY and girls(莫队算法+组合)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5145
题意:给你n,m,共有n个女孩,标号为1—n,n个数xi表示第ith个女孩在第xi个教室,然后下面有m个询问,每个询问有l,r两个数,表示要去找编号为l到r的女孩,每进一次教室只能找一个女孩,问有多少种组合方式,不同的组合方式定义为去教室的顺序不同。
题解:这题是离线的,很容易想到用莫队分块做,主要是要找出状态转移的方程,对于询问区间[l,r],假设这个区间的女孩一共分布在k个教室,每个教室有a1,a2,a3....ak个女孩
则这个区间的ans=C(r-l+1,a1)*C(r-l+1-a1,a2)......C(r-l+1-a1-a2..-ak-1,ak),整理方程,消去约数 得ans=(r-l+1)!/a1!*a2!*a3!...ak!。然后这时候 当r=r+1时,假设r+1这个女孩在a1这个教室,那么此时的ans用上面的式子算出来得ans=(r-l+2)!/(a1+1)*a1!*a2!*a3!...ak!。我们可以发现 ans([l,r+1])=ans([l,r])*(r-l+2)/(a1+1)。然后状态转移的方程就出来了,最后再预处理一下逆元,就可以开始出答案了。
#include<cstdio>
#include<algorithm>
#include<cmath>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=3e4+,mod=1e9+;
//逆元筛
long long inv[N]={,};
void init(){F(i,,N-)inv[i]=inv[mod%i]*(mod-mod/i)%mod;} int t,n,m,a[N],sqr,cnt[N],ans[N];//sqr为分块的大小,cnt记录的对应教室的女孩数
//以左边边界所在的块为首关键字,左边边界所在的块为第二关键字排序
struct qy{
int l,r,lid,idx;
bool operator<(const qy& b)const{
if(lid==b.lid)return r<b.r;
else return lid<b.lid;
}
}q[N]; int main(){
init(),scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m),sqr=(int)sqrt(1.0*n);
F(i,,n)scanf("%d",a+i);
F(i,,N-)cnt[i]=;
F(i,,m){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].lid=q[i].l/sqr,q[i].idx=i;
}
sort(q+,q++m);
int l=,r=,len=;
long long ret=;
F(i,,m){
while(r<q[i].r){
r++,len++,cnt[a[r]]++;
ret=(ret*len%mod)*inv[cnt[a[r]]]%mod;
}
while(r>q[i].r){
ret=(ret*cnt[a[r]]%mod)*inv[len]%mod;
cnt[a[r]]--,r--,len--;
}
while(l>q[i].l){
l--,len++,cnt[a[l]]++;
ret=(ret*len%mod)*inv[cnt[a[l]]]%mod;
}
while(l<q[i].l){
ret=(ret*cnt[a[l]]%mod)*inv[len]%mod;
cnt[a[l]]--,l++,len--;
}
ans[q[i].idx]=ret;
}
F(i,,m)printf("%d\n",ans[i]);
}
return ;
}
hdu_5145_NPY and girls(莫队算法+组合)的更多相关文章
- HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)
传送门 题意 给出n个数,m次访问,每次询问[L,R]的数有多少种排列 分析 \(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一 ...
- 【BZOJ】2038: [2009国家集训队]小Z的袜子(hose)(组合计数+概率+莫队算法+分块)
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 学了下莫队,挺神的orzzzz 首先推公式的话很简单吧... 看的题解是从http://for ...
- HDU 5145 NPY and girls(莫队算法+乘法逆元)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5145 [题目大意] 给出一个数列,每次求一个区间数字的非重排列数量.答案对1e9+7取模. [题解 ...
- NPY and girls-HDU5145莫队算法
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
- hdu 5145(莫队算法+逆元)
NPY and girls Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- C++ 莫队算法(转)
胡小兔的良心莫队教程:莫队.带修改莫队.树上莫队 在开始学习莫队之前,照例先甩一道例题:BZOJ 1878 HH的项链. 题意:求区间内数的个数,相同的数只算一次. 在我关于这道题的上一篇题解中, ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法模版】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意概括: 有 N 只袜子(分别编号为1~N),有 M 次查询 (L, R)里面随机 ...
- NBUT 1457 莫队算法 离散化
Sona Time Limit:5000MS Memory Limit:65535KB 64bit IO Format: Submit Status Practice NBUT 145 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
随机推荐
- xxx app 项目问题解决一览
前话:作为人生旅途中的小记录 不同账号玩法限制 解决 <vn_rule>x</vn_rule> 6.调整下注筹码 **** 解决 不同账号的玩法限制 **** ...
- ssl证书验证
当我们在访问https网站时,浏览器就会自动下载该网站的SSL证书,并对证书的安全性进行检查. 其他概念不说了,有效期之类的验证也不说了.只说数字证书的真实性和可信性验证. 1.CA下发给网站的证书是 ...
- ==、equals、hashCode区别?
[==.equals().hashCode()区别?] 1)== 运算符用来比较两个变量的值是否相等. 即该运算符用于比较变量对应得内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是 ...
- hdu_5768_Lucky7(中国剩余定理+容斥)
题目链接:hdu_5768_Lucky7 题意: 给你一个区间,问你这个区间内是7的倍数,并且满足%a[i]不等于w[i]的数的个数 乍一看以为是数位DP,仔细看看条件,发现要用中国剩余定理,然后容斥 ...
- 弹出框,先弹出遮罩有透明度灰色100%高宽,置顶z-index:999---再弹出框最顶部z-index:9999
<div class="mask"></div> <div class="maskbox"> <form id=&qu ...
- 取出parentid为null的顶级栏目 等号改为 is null 避免null当做字符串,
mysql中查询字段为null或者不为null 在mysql中,查询某字段为空时,不可用等号 = null, 而是 is null,不为空则是 is not null select * from ...
- git fetch pull checkout区别
Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge <p style="margin-top: 0 ...
- 今天遇到了隐藏顶部菜单栏(top bar)的菜鸟问题,解决了。
self.navigationController.navigationBarHidden = YES; http://stackoverflow.com/questions/3397381/hide ...
- ecshop后台管理显示扩展分类
ecshop 后台商品列表默认只显示分类下的商品,而不显示扩展分类中的商品,以下是我个人给出的解决方法: 打开admin/includes/lib_goods.php 第839行左右的位置 可以看到如 ...
- git clone 太慢怎么办?
Git 和 GitHub 的出现打开了开源世界的另一扇大门,版本控制变得更强大(也更复杂),项目的管理变得更加容易,项目的开发也变得更容易进行多人协作.GitHub 无疑是程序员的 Facebook ...