HDU 5145 分块 莫队
给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种。
数值都是30000规模
首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\binom{len}{k_1}$,那么下种元素即为$\binom{len-k_1}{k2}$,以此类推,直至最后直接填满,那么全排列为${\frac{len!}{k_1!k_2!…k_n!}}$
然后可以发现可以直接O(1)求得左右相邻区间的值(就是乘或除),那么考虑分块莫队。
/** @Date : 2017-09-23 18:57:10
* @FileName: HDU 5145 分块 莫队.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8;
const LL mod = 1e9 + 7; int k[30010];
int a[30010];
int blc[30010];
LL fac[30010];
LL inv[30010];
LL res[30010];
struct yuu
{
LL l, r;
int m;
}b[30010]; int cmp(yuu a, yuu b)
{
if(blc[a.l] != blc[b.l])
return a.l < b.l;
return a.r < b.r;
} void init()
{
fac[0] = fac[1] = 1;
inv[0] = inv[1] = 1;
for(LL i = 2; i <= 30005; i++)
{
fac[i] = (fac[i - 1] * i % mod + mod) % mod;
inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}
}
int main()
{
init();
int T;
cin >> T;
while(T--)
{
LL n, q;
scanf("%lld%lld", &n, &q);
int sqr = sqrt(1.0 * n);
for(int i = 1; i <= n; i++)
scanf("%d", a + i), blc[i] = (i - 1) / sqr + 1;
for(int i = 1; i <= q; i++)
{
scanf("%lld%lld", &b[i].l, &b[i].r);
b[i].m = i;
}
sort(b + 1, b + 1 + q, cmp);
MMF(k);
LL l = 1, r = 0;
LL ans = 1, cnt = 0;
for(int i = 1; i <= q; i++)
{
while(r < b[i].r)
{
r++;
k[a[r]]++;
cnt++;
ans = (ans * cnt % mod * inv[k[a[r]]] % mod + mod) % mod;
}
while(l > b[i].l)
{
l--;
cnt++;
k[a[l]]++;
ans = (ans * cnt % mod * inv[k[a[l]]] % mod + mod) % mod;
}
while(r > b[i].r)
{
ans = (ans * inv[cnt] % mod * k[a[r]] % mod + mod) % mod;
cnt--;
k[a[r]]--;
r--;
}
while(l < b[i].l)
{
ans = (ans * inv[cnt] % mod * k[a[l]] % mod + mod) % mod;
cnt--;
k[a[l]]--;
l++;
}
while(ans < 0)
ans += mod;
res[b[i].m] = ans;
}
for(int i = 1; i <= q; i++)
printf("%lld\n", res[i]);
}
return 0;
}
HDU 5145 分块 莫队的更多相关文章
- 【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法
3809: Gty的二逼妹子序列 Time Limit: 80 Sec Memory Limit: 28 MBSubmit: 1072 Solved: 292[Submit][Status][Di ...
- 2018.11.07 NOIP训练 L的鞋子(权值分块+莫队)
传送门 乱搞题. 我直接对权值分块+莫队水过了. 不过调了30min30min30min发现ststst表挂了是真的不想说什么233. 代码
- bzoj 3585 mex - 线段树 - 分块 - 莫队算法
Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...
- 【BZOJ2038】【2009国家集训队】小Z的袜子(hose) 分块+莫队
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- BZOJ.3809.Gty的二逼妹子序列(分块 莫队)
题目链接 /* 25832 kb 26964 ms 莫队+树状数组:增加/删除/查询 都是O(logn)的,总时间复杂度O(m*sqrt(n)*logn),卡不过 莫队+分块:这样查询虽然变成了sqr ...
- 分块+莫队||BZOJ3339||BZOJ3585||Luogu4137||Rmq Problem / mex
题面:P4137 Rmq Problem / mex 题解:先莫队排序一波,然后对权值进行分块,找出第一个没有填满的块,直接for一遍找答案. 除了bzoj3339以外,另外两道题Ai范围都是1e9. ...
- 【BZOJ 2120】数颜色【分块/莫队】
题意 给出n个数字和m个操作.操作有两种.1:查询区间[l,r]内不同种类得数字个数.2: 将下标为p得数字修改为v 分析 如果不是修改操作的话,用莫队贼简单就可以水过,但是因为带了修改就有一些麻烦了 ...
- P4396 [AHOI2013]作业 分块+莫队
这个题正解是莫队+树状数组,但是我个人非常不喜欢树状数组这种东西,所以决定用分块来水这个题.直接在莫队维护信息的时候,维护单点同时维护块内信息就行了. 莫队就是这几行核心代码: void add(in ...
- BZOJ 3585: mex(分块+莫队)
传送门 解题思路 首先直接莫队是能被卡的,时间复杂度不对.就考虑按照值域先进行分块再进行莫队,然后统计答案的时候就暴力扫所有的块,直到一个块内元素不满,再暴力扫这个块就行了,时间复杂度O(msqrt( ...
随机推荐
- 第六次作业psp
psp 进度条 代码累积折线图 博文累积折线图 psp饼状图
- Requests库与HTTP协议
了解HTTP协议 请求与响应模式的协议: 用户提出对URL(用来定位网络中的资源位置)地址数据的操作请求,服务器给予相应. 无状态的应用层协议:两次请求之间不会互相影响. HTTP协议支持的请求种类: ...
- 开发环境解决 kafka Failed to send messages after 3 tries
新建了一个kafka集群,在window下写了一个简单的producer做测试,结果遇到了消息发送失败的问题,代码如下: Properties props = new Properties(); pr ...
- PHP 操作redis 详细讲解 转的 http://www.cnblogs.com/jackluo/p/3412670.html
phpredis是redis的php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: https://github. ...
- 在MFC中显示cmd命令行
添加函数 void InitConsoleWindow1() { ; FILE* fp; AllocConsole(); nCrt = _open_osfhandle((long)GetStdHand ...
- mysql(四)log
慢查询: https://blog.csdn.net/leshami/article/details/39829605 日志组成: https://blog.csdn.net/leshami/arti ...
- 英文报道:China challenged Australian warships in South China Sea, reports say
学习地道新闻英语表达,以下文章来自CNN By Ben Westcott and Jamie Tarabay, CNN Updated 0830 GMT (1630 HKT) April 20, 20 ...
- MD5加密概述
一.Note: 写到这篇文章是工作中实际遇到了,以前都听过不过没有细看.这里简单概述下,原理的话需要看看更专业的介绍了. 二.MD5简介 Message Digest Algorithm MD5(中文 ...
- [CF1111D]Destroy the Colony
题目大意:有一个长度为$n(n\leqslant10^5,n=0\pmod2)$的字符串,字符集大小为$52$,有$q(q\leqslant10^5)$次询问,每次询问第$x,y$个字符在这个字符串的 ...
- 洛谷 P4027 [NOI2007]货币兑换 解题报告
P4027 [NOI2007]货币兑换 题目描述 小 \(Y\) 最近在一家金券交易所工作.该金券交易所只发行交易两种金券:\(A\) 纪念券(以下简称 \(A\) 券)和 \(B\) 纪念券(以下简 ...