hdu5145 NPY and girls
人生中第一道莫队,本来以为是一道水题的。。
首先这题只有区间查询,没有修改操作,使用莫队比较明显,但统计答案有点麻烦。。
根据题意,在n个人里选m个不相同种类的人,设第i种人数量为ai,总方案为c(n,a1)*c(n-a1,a2)*c(n-a1-a2,a3)*...*c(n-a1-a2-...-an-1,an)。而我们要用O(1)的复杂度实现转移,那么我们可以用c(n,m)=c(n-1,m-1)*n/m来实现转移,在模意义下除法必须使用逆元,那么我们利用费马小定理预处理出每个值的逆元就好了。。
总的来说,莫队算法真的很神啊。。不仅思想简单,实现简单,复杂度还很优秀。。
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf 1<<30
#define il inline
#define RG register
#define ll long long
#define eps 1e-9
#define rhl 1000000007LL
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; struct node{ int l,r,id,bl; }p[30010]; int a[30010],c[30010],n,m;
ll inv[30010],ans[30010]; il int gi(){
RG int x=0,q=0; RG char ch=getchar();
while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); if (ch=='-') q=1,ch=getchar();
while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q ? -x : x;
} il int cmpt(const node &a,const node &b){ return a.bl<b.bl || (a.bl==b.bl && a.r<b.r); } il ll q_pow(RG ll a,RG ll b){ RG ll ans=1,x=a; while (b){ if (b&1) ans=ans*x%rhl; x=x*x%rhl,b>>=1; } return ans; } il void solve(){
RG int l=1,r=0; RG ll Ans=1;
for (RG int i=1;i<=m;++i){
while (l>p[i].l){ l--,c[a[l]]++,Ans=Ans*(ll)(r-l+1)%rhl*inv[c[a[l]]]%rhl; }
while (r<p[i].r){ r++,c[a[r]]++,Ans=Ans*(ll)(r-l+1)%rhl*inv[c[a[r]]]%rhl; }
while (l<p[i].l){ Ans=Ans*(ll)c[a[l]]%rhl*inv[r-l+1]%rhl,c[a[l]]--,l++; }
while (p[i].r<r){ Ans=Ans*(ll)c[a[r]]%rhl*inv[r-l+1]%rhl,c[a[r]]--,r--; }
ans[p[i].id]=Ans;
}
return;
} il void work(){
n=gi(),m=gi(); RG int block=sqrt(n*1.0); for (RG int i=1;i<=n;++i) a[i]=gi(),c[i]=0,ans[i]=0;
for (RG int i=1;i<=m;++i) p[i].l=gi(),p[i].r=gi(),p[i].id=i,p[i].bl=(p[i].l-1)/block+1;
sort(p+1,p+m+1,cmpt); solve(); for (RG int i=1;i<=m;++i) printf("%lld\n",ans[i]); return;
} int main(){
File("npy");
for (RG int i=1;i<=30000;++i) inv[i]=q_pow((ll)i,(ll)rhl-2);
RG int T=gi(); while (T--) work();
return 0;
}
hdu5145 NPY and girls的更多相关文章
- HDU 5145 NPY and girls 莫队+逆元
NPY and girls Problem Description NPY's girlfriend blew him out!His honey doesn't love him any more! ...
- NPY and girls
NPY and girls 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5145 莫队算法 注意到没有修改区间的操作,使用莫队算法:将整个区间分成若干 ...
- 【HDU 5145】 NPY and girls(组合+莫队)
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...
- HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)
传送门 题意 给出n个数,m次访问,每次询问[L,R]的数有多少种排列 分析 \(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一 ...
- HDU 5145 - NPY and girls
题意: cases T(1≤T≤10) (0<n,m≤30000) (0<ai≤30000) n个数ai 表示n个女孩所在教室 m次询问 [L,R](1 <= L <= ...
- HDU 5145 NPY and girls(莫队算法+乘法逆元)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5145 [题目大意] 给出一个数列,每次求一个区间数字的非重排列数量.答案对1e9+7取模. [题解 ...
- HDU 5145 NPY and girls (莫队分块离线)
题目地址:HDU 5145 莫队真的好奇妙.. 这种复杂度竟然仅仅有n*sqrt(n)... 裸的莫队分块,先离线.然后按左端点分块,按块数作为第一关键字排序.然后按r值作为第二关键字进行排序. 都是 ...
- hdu 5145(莫队算法+逆元)
NPY and girls Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- NPY and girls-HDU5145莫队算法
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
随机推荐
- javaScript事件(六)事件类型之滚轮事件
滚轮事件其实就是一个mousewheel事件,这个事件跟踪鼠标滚轮,类似Mac的触屏版. 一.客户区坐标位置 鼠标事件都是在浏览器视口的特定位置上发生的.这个位置信息保存在事件对象的clientX和c ...
- React 进修之路(2)
生命周期 React中的组件被看成是一个有生命的个体,因此赋予了声明周期的概念,就是为了定义组件所处的状态 React中组件共分三大周期,11个阶段 创建期(少年,成长)组件创建时候进入的时期 get ...
- python 中的input()和raw_input()功能与使用区别
在python中raw_input()和input()都是提示并获取用户输入的函数,然后将用户的输入数据存入变量中.但二者在处理返回数据类型上有差别. input()函数是raw_intput()和e ...
- Android 快速开发系列 ORMLite 框架最佳实践
比较靠谱的Helper的写法: 1.DatabaseHelper package com.zhy.zhy_ormlite.db; import java.sql.SQLException; impor ...
- android国际化
语言的国际化 为了提供不同语言的版本,只需要在res中新建几个values文件夹就行 不过文件夹有自己的命名规则 values-语言代码-r国家或者地区的代码 然后我们只需要将不同语言的string. ...
- 【树莓派】Linux 测网速及树莓派源
这篇文章比较杂,其中包含三点:linux环境中测试网络速度,树莓派下载软件的源,部分我写好的脚本: 一.Linux 测网速 Linux 测网速: sar -n DEV 1 100 1代表一秒统计并显示 ...
- 2.WP8.1开发_在顶部显示标题和进度
有时候加载页面的时候,需要在信号那一栏显示进度,或者把信号栏改成标题 1.确保显示状态栏.默认显示.如果不显示,可以在应用程序启动后手动用代码显示,代码如下: //取得状态栏 StatusBar ba ...
- 基于EM的多直线拟合
作者:桂. 时间:2017-03-22 06:13:50 链接:http://www.cnblogs.com/xingshansi/p/6597796.html 声明:欢迎被转载,不过记得注明出处哦 ...
- 关于修改编JDK编译环境的问题
最近从svn下拿的代码本地编译测试总是会出一个Unsupported major.minor version 51.0...的问题,出现这样的问题基本上都是因为JDK版本的问题,由于高版本JDK编译的 ...
- MCMC(一)蒙特卡罗方法
MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链(待填坑) MCMC(三)M-H采样和Gibbs采样(待填坑) 作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Ca ...