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提高学习之Object(2)
Equality 问:euqals()函数是用来做什么的? 答:equals()函数可以用来检查一个对象与调用这个equals()的这个对象是否相等. 问:为什么不用“==”运算符来判断两个对象是否相 ...
- U盘安装ubuntu14.10时出现的gfxboot.c32:not a COM32R image问题
最近ubuntu14.10出来了,因为从ubuntu14.04升级不是很成功,于是就重新下载了14.10的系统镜像(苦逼的无线啊).于是我按照以往的方式用软碟通将镜像解压到U盘里,重启系统,却出现了g ...
- 基于位运算符的IP和数值转换
直接上代码: $str = '192.168.2.100'; echo 'IP:',$str,'<hr />'; $int = ip_long($str); echo $int,'< ...
- Eclipse下如何打开ftl文件
ftl文件是freemarker模板文件,用freemarker时,常用该文件模板:但是该文件在eclipse编辑时,黑白底的,没有任何提示,下面介绍如何用JSP编辑器打开该文件. 工具/原料 e ...
- 减小Delphi的Exe文件大小(11种方法)
一般来说,由Delphi生成的EXE文件,要比其由它编程语言生成的体积大一些.这主要是由于使用VCL的原因(当然,VCL是有许多优点的!) 以下是减小EXE文件大小的几种途径: 01) 使用加壳工具( ...
- [Drools]JAVA规则引擎 -- Drools 2
上一篇文章 http://blog.csdn.net/quzishen/archive/2011/01/25/6163012.aspx 描述了一些常用的drools的语法标签和一个模拟实例即发送积分的 ...
- c++ 关于类构造函数的初始化列表
除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义的时候初始化,并且不能重 ...
- python entry points 例子
pbr的介绍不多,http://ju.outofmemory.cn/entry/156745 $ mkdir entry_test; cd entry_test; git init $ mkdir ...
- 面向对象程序设计-C++_课时28静态对象_课时29静态成员
Static in C++ Two basic meanings Static Storage --allocated once at a fixed address Visibility of a ...
- 微信token认证方法原理
var http = require('http'); var url = require("url"); var crypto = require("crypto&qu ...