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莫队算法的更多相关文章

  1. HDU 5145 NPY and girls(莫队算法+乘法逆元)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5145 [题目大意] 给出一个数列,每次求一个区间数字的非重排列数量.答案对1e9+7取模. [题解 ...

  2. HDU 5145 NPY and girls (莫队分块离线)

    题目地址:HDU 5145 莫队真的好奇妙.. 这种复杂度竟然仅仅有n*sqrt(n)... 裸的莫队分块,先离线.然后按左端点分块,按块数作为第一关键字排序.然后按r值作为第二关键字进行排序. 都是 ...

  3. hdu5145 莫队算法

    这题说的是个了n个数字 然后 在L 和R 区间内的数字的排列有多少种方案, 这里我们通过 将 这n长度的字符串 分成sqrt(n) 块然后 一个属性 他们的l 属于 那个快  以这个为第一关键字 ,然 ...

  4. HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)

    传送门 题意 给出n个数,m次访问,每次询问[L,R]的数有多少种排列 分析 \(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一 ...

  5. hdu 5145(莫队算法+逆元)

    NPY and girls Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  6. NBUT 1457 莫队算法 离散化

    Sona Time Limit:5000MS     Memory Limit:65535KB     64bit IO Format: Submit Status Practice NBUT 145 ...

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  8. Codeforces617 E . XOR and Favorite Number(莫队算法)

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

  9. Bzoj 2038---[2009国家集训队]小Z的袜子(hose) 莫队算法

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色 ...

随机推荐

  1. 带你玩转JavaWeb开发之六-mysql基本语法详解及实例(3)

    [语法] update 表名 set 列名=列值,列名=列值 -[条件]; [注意事项] * 修改的列的值需要与列的类型一致. * 修改的列的值的长度不能超过列的类型的最大长度. * 字符串类型和日期 ...

  2. wed应用程序开发原理

    ---恢复内容开始--- 企业应用演变的模式 1.主机/哑终端的集中计算模式 时间二十世纪七十年代,企业应用程序是围绕一个中心大型主机建立的.特点 大,贵,专用.只有输入输出功能,没有处理能力,全部是 ...

  3. 代码阅读分析工具Understand 2.0试用

    Understand 2.0是一款源代码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实可以大大提高代码阅读效率.由于Understand功能十分强大,本文不可能详尽地介绍它的所有功能,所 ...

  4. blowfish ECB decode

    blowfish  ECB  Decode package main import ( "crypto/cipher" "encoding/hex" " ...

  5. Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)

    一.介绍 随着Swift的逐渐成熟,使用swift开发或者混合开发已经成为了一个趋势,本身苹果公司也十分推荐使用Swift这门新语言.目前Swift已经更新到了3.0,估计没有多久4.0就要出来了.那 ...

  6. 对bootstrap中confirm alert进行封装

    HTML: <!-- system modal start --> <div id="ycf-alert" class="modal"> ...

  7. JFinal学习

    1 jfinal-1.9-bin.jar 2 继承Controller编写控制器 public void sendJPushToXXX() { String userId = getPara(&quo ...

  8. C#大文件读取和查询--内存映射

    笔者最近需要快速查询日志文件,文件大小在4G以上. 需求如下: 1.读取4G左右大小的文件中的指定行,程序运行占用内存不超过500M. 2.希望查询1G以内容,能控制在20s左右. 刚开始觉得这个应该 ...

  9. 网页3D引擎“Babylon.JS”入门教程翻译总结

    使用三个月的业余时间把官方教程的入门部分译为中文并上传到github,在下一步编程前做一个总结. 历程: 最早接触游戏编程是在大三下学期,用汇编语言和实验室里的单片机.触摸屏.电机(提供声效)编的打地 ...

  10. Css深入理解之浮动_慕课网课程笔记

    前言 这篇是在慕课网上跟着张鑫旭重走CSS之路的第三篇学习笔记了,主要是学习float属性,闲话少说,下面进入正文. float的历史 要想了解一个东西,我们还是需要从本质去了解它,那么我们就需要问一 ...