pid=5145">【HDU 5145】 NPY and girls(组合+莫队)

NPY and girls

Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 593    Accepted Submission(s): 179

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
 
Source
 
Recommend
heyang
 

题目大意:T组输入

每组两个数 n m分别表示人数n和询问次数m

之后n个数 表示n个女孩所在教室

对于m次询问 每次一个[L,R](1 <= L <= R <= n) 问为了訪问到每一个女孩 訪问教室的方案有几种(会出现几个女孩在一个教室的情况 但每次訪问教室仅仅能找一个女孩 同一个编号的教室是同样的)

对于单组询问[L,R] 如果有n中班级 每一个班级有c个女生 总共m个女生 那么答案就是C(m,c1)*C(m-c1,c2)*C(m-c1-c2,c3)*....*C(cn,cn)

但假设每次都暴力的进行统计然后求组合数 果果的会超时

这样就要用莫队 把区间n进行分块 分成n/sqrt(n)份 进行分块排序

然后按分好的顺序进行区间的扩大或缩小 这样能够发现对组合数的求解也能够在区间转换的过程中进行

由于C(m+1,n+1) = C(m,n)*(m+1/n+1)

相同的 C(m,n) = C(m+1,n+1)*(n+1/m+1) (对于缩小的过程而言)

这样 因为n和m的范围都在30000之内 并且要求最后对一个大素数取余 能够用费马小定理高速求出范围内全部数的逆元

然后就像上面说的对区间进行转换 然后离线处理存储答案 最后输出就可以 记得答案要存在排序前的位置中。。。由于这个WA找了好久错误=.=

代码例如以下:

#include <iostream>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <list>
#include <algorithm>
#include <map>
#include <set>
#define LL long long
#define Pr pair<int,int>
#define fread() freopen("in.in","r",stdin)
#define fwrite() freopen("out.out","w",stdout) using namespace std;
const int INF = 0x3f3f3f3f;
const int msz = 10000;
const LL mod = 1e9+7;
const double eps = 1e-8; LL pow_m(LL a,LL b)
{
LL ans = 1;
while(b)
{
if(b&1) ans = (ans*a)%mod;
b >>= 1;
a = (a*a)%mod;
}
return ans;
} LL Inv(LL a)
{
return pow_m(a,mod-2);
} int per;
struct Range
{
int l,r,id;
bool operator < (const struct Range a)const
{
return l/per == a.l/per? r < a.r: l/per < a.l/per;
}
}; Range rg[30030];
LL ans[30030];
LL inv[30030];
int cla[30030];
int cnt[30030]; int main()
{
//fread();
//fwrite(); for(int i = 1; i <= 30000; ++i)
inv[i] = Inv(i); int t,n,q; scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&q);
per = sqrt(n*1.0); for(int i = 1; i <= n; ++i)
scanf("%d",&cla[i]); for(int i = 0; i < q; ++i)
{
scanf("%d%d",&rg[i].l,&rg[i].r);
rg[i].id = i;
} sort(rg,rg+q); int l = 1, r = 0;
LL tmp = 1;
memset(cnt,0,sizeof(cnt));
for(int i = 0; i < q; ++i)
{
while(r < rg[i].r)
{
++r;
cnt[cla[r]]++;
tmp = tmp*(r-l+1)%mod*inv[cnt[cla[r]]]%mod;
}
while(l > rg[i].l)
{
--l;
cnt[cla[l]]++;
tmp = tmp*(r-l+1)%mod*inv[cnt[cla[l]]]%mod;
} while(r > rg[i].r)
{
tmp = tmp*cnt[cla[r]]%mod*inv[r-l+1]%mod;
cnt[cla[r]]--;
--r;
} while(l < rg[i].l)
{
tmp = tmp*cnt[cla[l]]%mod*inv[r-l+1]%mod;
cnt[cla[l]]--;
++l;
}
ans[rg[i].id] = tmp;
}
for(int i = 0; i < q; ++i)
printf("%I64d\n",ans[i]); } return 0;
}

【HDU 5145】 NPY and girls(组合+莫队)的更多相关文章

  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. HDU 5145 NPY and girls 莫队+逆元

    NPY and girls Problem Description NPY's girlfriend blew him out!His honey doesn't love him any more! ...

  4. 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 <= ...

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

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

  6. hdu 5381 The sum of gcd 莫队+预处理

    The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) P ...

  7. HDU 4676 Sum Of Gcd 【莫队 + 欧拉】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=4676 Sum Of Gcd Time Limit: 10000/5000 MS (Java/Others ...

  8. hdu 4358 Boring counting dfs序+莫队+离散化

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others) ...

  9. HDU 4358 Boring counting dfs序+莫队算法

    题意:N个节点的有根树,每个节点有一个weight.有Q个查询,问在以u为根的子树中,有恰好出现了K次的weight有多少种. 这是第一次写莫队算法,之前也只是偶有耳闻. 看了别人的代码打的,还是贴上 ...

随机推荐

  1. JS数据分组[JSON]

    JS 数据分组 var arr = [{ "id": "1001", "name": "值1", "value ...

  2. 【基于mini2440开发板的交叉编译环境及内核树配置.

    在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙.高高大大的墙...笔者在初探这一方向时,就在这2个问题上苦恼了很久.查阅无数资料,大多 ...

  3. mycql 基本mysql语句(增删改查)

    操作文件夹(库) 增 (增加一个库 db1 ) create database db1 charset utf8; 查 # 查看当前创建的数据库 show create database db1; # ...

  4. ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)

    功能概述 Excel2HtmlTable的主要功能就是把Excel的内容以表格的方式,展现在页面中.Excel的多个Sheet对应页面的多个Tab选项卡.转换算法的难点在于,如何处理行列合并,将Exc ...

  5. js实现点击复制网页内容(基于execCommand)

    通过execCommand方法来实现,当一个HTML文档切换到设计模式 designMode时,文档对象暴露 execCommand 方法,该方法允许运行命令来操纵可编辑区域的内容.大多数命令影响文档 ...

  6. WampServer更改或重置数据库密码

    WampServer安装后密码是空的, 修改一般有两种方式: 一是通过phpMyAdmin直接修改: 二是使用WAMP的MySql控制台修改. 第一种: ①在phpMyAdmin界面中点击[用户],将 ...

  7. 利用VisualVM监视远程JVM

    VisualVM介绍 VisualVM是集成了多个JDK命令工具的一个可视化工具,它主要用来监控JVM的运行情况,可以用它来查看和浏览Heap Dump.Thread Dump.内存对象实例情况.GC ...

  8. MonkeyRunner源代码分析之启动

    在工作中由于要追求完毕目标的效率,所以很多其它是强调实战.注重招式.关注怎么去用各种框架来实现目的.可是假设一味仅仅是注重招式.缺少对原理这个内功的了解,相信自己非常难对各种框架有更深入的理解. 从几 ...

  9. 在Redhat Linux中执行非Redhat的Openstack, Redhat将对其Linux不提供支持

    一声叹息. IBM.HP.Dell, Mirantis, Piston等.请问.你们还把你们的Openstack部署在Redhat中吗? http://blogs.wsj.com/digits/201 ...

  10. MongoDB(一)——简介

    这两天简单学习了一下MongoDB数据库,属于NoSQL类型数据库的一种,先简单宏观的看一下NoSQL的相关知识和MongoDB的基础知识. NoSQL是Not Only SQL的缩写,它指的是非关系 ...