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 ...
随机推荐
- js上拉跳转原理
今天遇到一个需要上拉跳转的地方,其原理跟上拉加载有点类似,代码如下 window.onscroll = function(){ if(getScrollTop() + getClientHeight( ...
- sysadmin_basement
基本部分 1. 系统硬件 1.1. 主板 获取序列号 $ sudo dmidecode -t system |grep -i Serial Serial Number: CNU9032T3N 获取厂商 ...
- 1.0 Python 学习网站
w3cschool : http://www.runoob.com/python/python-tutorial.html cnblog Python 从入门到精通: http://www.cnbl ...
- winsock编程WSAAsyncSelect模型
winsock编程WSAAsyncSelect模型 WSAAsyncSelect模型也称异步选择模型,其核心函数是WSAAsyncSelect.它可以用来在一个socket上接收以windows消息为 ...
- LYF模板连接.txt
在解决方案里创建了一个新建网站,在其右键下添加一个模板后,准备使用模板的,在添加新建项里突然没有“使用模板页的web窗体”,顿时感觉悲剧... 解决方法:模板页代码---LYFMaterPage.Ma ...
- HDU - 5547 Sudoku(数独搜索)
Description Yi Sima was one of the best counselors of Cao Cao. He likes to play a funny game himself ...
- Linux平台从文件中查找字符赋值于变量
以telnet方式登录Linux主机,在默认目录下用命令创建一个包含DUT wanIP的文本文件.[root] echo wanIP=88.0.100.253 > ./wanIP.txt在默认目 ...
- http GET
向php脚本中传参数可以用http GET 方法,比如要向file.php传两个参数v1和v2.则可以这么做 file.php?v1=&v2= (一个链接而已,直接编辑URL即可传参数了) 这 ...
- away 3d的一些问题
不能成功draw m3u8视频流问题: Texture2DBase.as return context.createRectangleTexture(_width, _height, Context3 ...
- SQL Server不能通过外部IP访问,解决方法
SQL Server不能通过外部IP访问,解决方法 版本:SQL server 2008 express with tools 打开配置管理器,开启 TCP,右键属性设置TCP端口: 设置 ...