题意: cases T(1≤T≤10) (0<n,m≤30000) (0<ai≤30000)
      

    n个数ai 表示n个女孩所在教室

    m次询问 [L,R](1 <= L <= R <= n)
     

    问访问所有女孩的顺序方案数(进教室顺序)为多少(一次进教室只能访问一个人)
    
分析:

    莫队算法 + 排列数

    一个区间内的方案数为 C(m,c1)*C(m-c1,c2)*C(m-c1-c2,c3)*....*C(cn,cn)
      

    每次转移通过下式:

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

     C(m,n) = C(m+1,n+1) * (n+1/m+1) (对于缩小的过程而言)
    
      因为需要对大素数取模,除法就是乘上对应的乘法逆元,故先用费马小定理

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
const int MOD = ;
const int MAXN = ;
const int MAXM = ;
struct Query
{
int L,R,id;
}node[MAXM];
struct Ans
{
long long a;
}ans[MAXM];
int a[MAXN],num[MAXN];
long long inv[MAXN];//乘法逆元
int t,n,m,unit;
void work()
{
long long temp = ;
memset(num,,sizeof(num));
int L = , R = ;
for(int i = ; i < m ; i++)
{
while(R < node[i].R)//C(m+1,n+1) = C(m,n)*(m+1/n+1)
{
R++;
num[a[R]]++;
temp = temp * (R - L + ) % MOD * inv[num[a[R]]] % MOD;
}
while(R > node[i].R)//C(m,n) = C(m+1,n+1)*(n+1/m+1)
{
temp = temp * num[a[R]] % MOD * inv[R - L + ] % MOD;
num[a[R]]--;
R--;
}
while(L < node[i].L)//C(m,n) = C(m+1,n+1)*(n+1/m+1)
{
temp = temp * num[a[L]] % MOD * inv[R - L + ] % MOD;
num[a[L]]--;
L++;
}
while(L > node[i].L)//C(m+1,n+1) = C(m,n)*(m+1/n+1)
{
L--;
num[a[L]]++;
temp = temp * (R - L + ) % MOD * inv[num[a[L]]] % MOD;
}
ans[node[i].id].a = temp;
}
}
bool cmp(Query a,Query b)
{
if(a.L/unit != b.L/unit) return a.L/unit < b.L/unit;
else return a.R < b.R;
}
void Init()//femat
{
inv[] = ;
for(int i = ; i < MAXN; i++)
inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD;
}
int main()
{
Init();
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i = ; i <= n; i++)
scanf("%d",&a[i]);
for(int i = ; i < m; i++)
{
scanf("%d%d",&node[i].L,&node[i].R);
node[i].id = i;
}
unit = (int)sqrt(n);
sort(node,node+m,cmp);
work();
for(int i = ; i < m ;i++)
printf("%lld\n",ans[i].a);
}
}

HDU 5145 - NPY and girls的更多相关文章

  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! ...

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

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

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

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

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

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

  5. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  6. NPY and girls

    NPY and girls 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5145 莫队算法 注意到没有修改区间的操作,使用莫队算法:将整个区间分成若干 ...

  7. HDU 5145 分块 莫队

    给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种. 数值都是30000规模 首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\bin ...

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

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

  9. HDU 3784 继续xxx定律 & HDU 2578 Dating with girls(1)

    HDU 3784 继续xxx定律 HDU 2578 Dating with girls(1) 做3748之前要先做xxx定律  对于一个数n,如果是偶数,就把n砍掉一半:如果是奇数,把n变成 3*n+ ...

随机推荐

  1. 关于Emit中动态类型TypeBuilder创建类标记的一点思考

      利用TypeBuilder是可以动态创建一个类型,现在有个需求,动态生成一个dll,创建类型EmployeeEx,需要继承原dll里面的Employee类,并包含Employee类上的所有类标记. ...

  2. Xcode 常用快捷键及代码自动排版 二

    Xcode常用快捷键,网上找的总结一下,特别是格式化代码 隐藏xcode command+h退出xcode command+q关闭窗口 command+w关闭所有窗口 command+option+w ...

  3. shell date格式化输出

    1-  echo `date "+%Y-%m-%d %H:%M:%S"` 2014-11-13 15:06:26 2-  echo `date "+%y-%m-%d %H ...

  4. 深入 char * ,char ** ,char a[ ] ,char *a[] 内核

    本文来自CSDN博客:daiyutage的文章 来源网页地址:http://blog.csdn.net/daiyutage/article/details/8604720 本人觉得这是一编很有价值的文 ...

  5. FFmpeg深入分析之零-基础 <第一篇>

    FFmpeg是相当强大的多媒体编解码框架,在深入分析其源代码之前必须要有基本的多媒体基础知识,否则其源代码会非常晦涩难懂.本文将从介绍一些基本的多媒体只是,主要是为研读ffmpeg源代码做准备,比如一 ...

  6. 线程池之ThreadPool类与辅助线程 - <第二篇>

    一.CLR线程池 管理线程开销最好的方式: 尽量少的创建线程并且能将线程反复利用(线程池初始化时没有线程,有程序请求线程则创建线程): 最好不要销毁而是挂起线程达到避免性能损失(线程池创建的线程完成任 ...

  7. shell 脚本文件十六进制转化为ascii码代码

    十六进制的A转化为十进制ASCII码: 1 printf "%d\n" "'A" 十六进制的A转化为十六进制ASCII码: 1 printf "%x\ ...

  8. UESTC_秋实大哥下棋 2015 UESTC Training for Data Structures<Problem I>

    I - 秋实大哥下棋 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  9. Combinations 解答

    Question Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. F ...

  10. 微型 Python Web 框架 Bottle - Heroin blog

    微型 Python Web 框架 Bottle - Heroin blog 微型 Python Web 框架 Bottle