NPY and girls-HDU5145莫队算法
| Time Limit: | 8000/4000 MS (Java/Others) |
|---|---|
| Memory Limit: | 32768/32768 K (Java/Others) |
Problem Description
NPY’s girlfriend blew him out!His honey doesn’t love him any more!However, he has so many girlfriend candidates.Because there are too many girls and for the convenience of management, NPY numbered the girls from 1 to n.These girls are in different classes(some girls may be in the same class).And the i-th girl is in class ai.NPY wants to visit his girls frequently.Each time he visits some girls numbered consecutively from L to R in some order. He can only visit one girl every time he goes into a classroom,otherwise the girls may fight with each other(-_-!).And he can visit the class in any order.
Here comes the problem,(NPY doesn’t want to learn how to use excavator),he wonders how many different ways there can be in which he can visit his girls.The different ways are different means he visits these classrooms in different order.
Input
The first line contains the number of test cases T(1≤T≤10).
For each test case,there are two integers n,m(0 < n,m≤30000) in the first line.N is the number of girls,and M is the number of times that NPY want to visit his girls.
The following single line contains N integers, a1,a2,a3,…,an, which indicates the class number of each girl. (0< ai ≤30000)
The following m lines,each line contains two integers l,r(1≤l≤r≤n),which indicates the interval NPY wants to visit.
Output
For each visit,print how many ways can NPY visit his girls.Because the ans may be too large,print the ans mod 1000000007.
Sample Input
2
4 2
1 2 1 3
1 3
1 4
1 1
1
1 1
Sample Output
3
12
1
莫队算法处理区间查询问题,对于[L,R]区间中的组合所有的情况是(R-L+!)!/(num[i]!num[j]!….),所以可以根据[L,R]的情况来推其他的情况。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int Max = 31000;
const int Mod =1e9+7;
typedef struct node
{
int l,r,Id;
int L;
bool operator < (const node &a)const
{
return L<a.L||(L==a.L&&r<a.r);
}
}Node;
int a[Max];
Node s[Max];
LL ans[Max];
LL Inv[Max];
int num[Max];
LL Pow(LL n,LL m)
{
LL ans = 1;
while(m)
{
if(m&1)
{
ans = (ans*n)%Mod;
}
n = (n*n)%Mod;
m>>=1;
}
return ans;
}
void Init() // 求逆元
{
for(int i = 0;i<=30000;i++)
{
Inv[i] = Pow(i,Mod-2);
}
}
int main()
{
Init();
int T;
int n,m;
scanf("%d",&T);
while(T--)
{
memset(num,0,sizeof(num));
scanf("%d %d",&n,&m);
int k = sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<m;i++)
{
scanf("%d %d",&s[i].l,&s[i].r);
s[i].L = s[i].l/k;
s[i].Id = i;
}
sort(s,s+m);
LL l=1,r=1;
num[a[1]]++;
LL res = 1;
for(int i=0;i<m;i++)
{
while(r<s[i].r)
{
r++;
num[a[r]]++;
res = (((r-l+1)*res)%Mod*Inv[num[a[r]]])%Mod;
}
while(r>s[i].r)
{
res = ((res*num[a[r]])%Mod*Inv[r-l+1])%Mod;
num[a[r]]--;
r--;
}
while(l>s[i].l)
{
l--;
num[a[l]]++;
res = (((r-l+1)*res)%Mod*Inv[num[a[l]]])%Mod;
}
while(l<s[i].l)
{
res = ((res*num[a[l]])%Mod*Inv[r-l+1])%Mod;
num[a[l]]--;
l++;
}
ans[s[i].Id] = res;
}
for(int i=0;i<m;i++)
{
printf("%lld\n",ans[i]);
}
}
return 0;
}
NPY and girls-HDU5145莫队算法的更多相关文章
- 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值作为第二关键字进行排序. 都是 ...
- hdu5145 莫队算法
这题说的是个了n个数字 然后 在L 和R 区间内的数字的排列有多少种方案, 这里我们通过 将 这n长度的字符串 分成sqrt(n) 块然后 一个属性 他们的l 属于 那个快 以这个为第一关键字 ,然 ...
- HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)
传送门 题意 给出n个数,m次访问,每次询问[L,R]的数有多少种排列 分析 \(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一 ...
- hdu 5145(莫队算法+逆元)
NPY and girls Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 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 ...
- Codeforces617 E . XOR and Favorite Number(莫队算法)
XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...
- Bzoj 2038---[2009国家集训队]小Z的袜子(hose) 莫队算法
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色 ...
随机推荐
- Tomcat catalina.out日志使用log4j按天分割
由于tomcat catalina.out日志不会自动分割, 一.日志分割所需包在附近中 1. 压缩包中有三个jar包: log4j-1.2.16.jar tomcat-juli-adapters.j ...
- Emmet使用
emmet官方文档 [翻译]Emmet (ZenCoding) 缩写语法 <!-- ul>li.item$*5 --> <ul> <li class="i ...
- 使用Python写Windows Service服务程序
1.背景 如果你想用Python开发Windows程序,并让其开机启动等,就必须写成windows的服务程序Windows Service,用Python来做这个事情必须要借助第三方模块pywin32 ...
- 初识The Battle of Polytopia
1.首先了解了一下<文明5-美丽新文明>视频介绍网址:http://list.youku.com/albumlist/show?id=19481409&ascending=1&am ...
- Quartz2D 编程指南(三)渐变、透明层 、数据管理
概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 渐变 简介 渐变是从一个颜色到另外 ...
- 树状sql--采用递归方式获取节点
创建数据库 create table City(id varchar(3) primary key , pid varchar(3) , name varchar(10)) 插入数据 insert i ...
- RabbitMQ系列之Centos 7安装RabbitMQ 3.6.1
1.安装EPEL-7: rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm 2.安 ...
- 把汉字转换为html实体编码
背景:工作中需要把汉字转换为html实体编码实现方式:import org.apache.commons.lang.StringEscapeUtils;public static void main( ...
- Excel标题与索引的对应关系
/// <summary> /// 返回对应标题的索引 /// </summary> /// <param name="columnTitle"> ...
- C++之路进阶——poj3461(Oulipo)
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35694 Accepted: 14424 Descript ...