HDU 5145 NPY and girls(莫队算法+乘法逆元)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5145
【题目大意】
给出一个数列,每次求一个区间数字的非重排列数量。答案对1e9+7取模。
【题解】
我们发现每次往里加入一个新的数字或者减去一个新的数字,前后的排列数目是可以通过乘除转移的,所以自然想到用莫队算法处理。因为答案要求取模,所以在用除法的时候要计算逆元。
【代码】
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
const int N=1000100;
using namespace std;
typedef long long LL;
const LL mod=1e9+7;
int pos[N],num[N],n,m,limit,i,l,r,S[N];
LL rf[N]={0,1};
LL ans,k,len;
inline void init(){for(int i=2;i<N;i++)rf[i]=rf[mod%i]*(mod-mod/i)%mod;}
struct Q{
int l,r,id;LL ans;
friend bool operator < (const Q &a,const Q &b){
return pos[a.l]<pos[b.l]||(pos[a.l]==pos[b.l]&&a.r<b.r);
}
}ask[N];
inline bool cmp(const Q &a,const Q &b){return a.id<b.id;}
inline void read(int&a){
char ch;while(!((ch=getchar())>='0')&&(ch<='9'));
a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';
}
inline void modify(int p,LL &ans,int add){
if(add>0)S[num[p]]++,ans=ans*(++len)%mod*rf[S[num[p]]]%mod;
else ans=ans*S[num[p]]%mod*rf[len--]%mod,S[num[p]]--;
}
int T;
int main(){
init(); read(T);
while(T--){
read(n);read(m);
limit=(int)sqrt(n+0.5);
memset(S,0,sizeof(S));
for(i=1;i<=n;i++){read(num[i]);pos[i]=(i-1)/limit+1;}
for(i=1;i<=m;i++){read(ask[i].l);read(ask[i].r);ask[i].id=i;}
sort(ask+1,ask+m+1); ans=1; len=0;
for(i=1,l=1,r=0;i<=m;i++){
while(r<ask[i].r)modify(++r,ans,1);
while(r>ask[i].r)modify(r--,ans,-1);
while(l<ask[i].l)modify(l++,ans,-1);
while(l>ask[i].l)modify(--l,ans,1);
ask[i].ans=ans;
}sort(ask+1,ask+m+1,cmp);
for(i=1;i<=m;i++)printf("%lld\n",ask[i].ans);
}return 0;
}
HDU 5145 NPY and girls(莫队算法+乘法逆元)的更多相关文章
- HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)
传送门 题意 给出n个数,m次访问,每次询问[L,R]的数有多少种排列 分析 \(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一 ...
- 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-HDU5145莫队算法
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
- 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 (莫队分块离线)
题目地址:HDU 5145 莫队真的好奇妙.. 这种复杂度竟然仅仅有n*sqrt(n)... 裸的莫队分块,先离线.然后按左端点分块,按块数作为第一关键字排序.然后按r值作为第二关键字进行排序. 都是 ...
- hdu_5145_NPY and girls(莫队算法+组合)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5145 题意:给你n,m,共有n个女孩,标号为1—n,n个数xi表示第ith个女孩在第xi个教室,然后下 ...
- hdu 5145(莫队算法+逆元)
NPY and girls Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- HDU 4358 莫队算法+dfs序+离散化
Boring counting Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 98304/98304 K (Java/Others)T ...
随机推荐
- Java学习之网络编程实例
转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一 ...
- CFILE追加写入文件
CFile file; file.Open(strName, CFile::modeWrite|CFile::modeNoTruncate|CFile::modeCreate); ) { file.S ...
- Java引用数据类型
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值.引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应 ...
- Python核心编程笔记---- print@2
print 的输出从定向问题 print 可以用’>>‘来重定向输出,下面是例子 f = open('D:/python.txt','w+') print >> f," ...
- sql server 2012 镜像和出现的问题
镜像安装的环境: 主机:win server 2012 , sql server 2012 ,ip:192.168.1.189 PC账户:administrator 备机:win server 20 ...
- 快速美眉(FastMM)使用手记
今天在SourceForge下到了FastMM (Fast Memory Manager),听说比官方的内存管理快多了,试了一下,果然不错.目前最新的是4.27. 就我的使用范围来说,我就是想看看我的 ...
- ceph伦理概念
Preface: CEPH: THE FUTURE OF STORAGE(未来存储) Ceph was made possible by a global community of passionat ...
- Mac 域名解析
1. 域名解析 如,解析 www.baidu.com 在终端输入, host www.baidu.com 题外话: 转载自:http://hoarn.blog.51cto.com/1642678/14 ...
- XML限制、初步WEB服务
DTD <!DOCTYPE 根元素 [ <!ELEMENT 元素 (a,b,c)>//必须按照根元素包含abc顺序排列 <!ATTLIST 属性 > ]> 引用方式 ...
- 值得赞扬的尝试与进步——CSDN开源夏令营第一印象
注:写这篇文章时我并未參加CSDN开源夏令营,也不确定是否会參加以及是否能參加上. 欣闻CSDN举办了"CSDN开源夏令营"活动.第一感觉是CSDN作为活动的组织者是很值得称赞的. ...