【Cf #502 H】The Films(莫队)

题面的简述:总共有$m$种书,书架上共有$n$本书,给出$n$本书的种类,并有$Q$个询问,每次询问给出$l, r, k$。每次询问时都会先出现$k * m$本书,每种书各$k$本,然后再加入书架上的$n$本书,共有$km + n$本书,从中随机取出$n$本随机顺序放回书架,问在$[l,r]$之间的书的种类和原来一样的概率,输出概率乘上总情况数,询问之间独立。
题面中已经把问题转化成有多少情况满足条件,我们考虑这个怎么算。首先考虑原位置不变的时候,我们考虑每一种颜色,用$c_{i}$表示$i$在$[l,r]$中出现次数,用$t_{i}$表示$i$在原序列中出现次数,如果只考虑$i$,那满足颜色$i$的方案数是:$C(t_{i} + k, c_{i})c_{i}!$,为了方便计算,我们直接用下降幂表示。那么根据乘法原理,所有的颜色都满足的方案数就是$\prod\limits_{i = 1}^{m} (t_{i} + k)^{\underline{c_{i}}}$。剩下的对于除$[l,r]$之外的位置随便放书就可以了,所以对于每个询问的最后答案就是$ans = (mk + n - r + l - 1)^{ \underline{ n - r + l - 1 } } \prod\limits_{i = 1}^{m} (t_{i} + k)^{\underline{c_{i}}}$。
我们考虑怎么计算上述式子,题中有一个很良心的性质,就是不同的$k$的个数不超过$100$,这提示我们可以对询问分类,对每一种$k$单独计算,接下来我们讲的都是对于某一个$k$计算询问的答案。
显然式子的前半部分我们可以$O(n)$预处理下降幂,询问时$O(1)$乘一下就行了,于是就是维护后半段,我们用莫队来实现,我们发现可以$O(1)$修改当前的值,因为某个位置颜色数的加一减一对答案的贡献是可以轻易知道的,那我们就可以完成这个问题了,只要松一下块大小就能过啦。
$\bigodot$技巧&套路:
- 组合数和下降幂的联系
- 暴力莫队出奇迹
#include <cstdio>
#include <iostream>
#include <algorithm> using namespace std; typedef long long LL;
const int N = , MOD = , BLO = ; int n, m, Q, k, res;
int fac[N], ifac[N], inv[N], prd[N];
int a[N], t[N], c[N], ans[N]; struct Que {
int l, r, k, id;
inline friend bool operator < (Que a, Que b) {
if (a.k != b.k) return a.k < b.k;
return (a.l / BLO != b.l / BLO)? (a.l < b.l) : (a.r < b.r);
}
} q[N]; int Down(int x, int y) {
if (x < y) throw;
return (LL) fac[x] * ifac[x - y] % MOD;
} void Inc(int x) {
if (!x) return;
++c[a[x]];
res = (LL) res * (t[a[x]] + k - c[a[x]] + ) % MOD;
}
void Dec(int x) {
if (!x) return;
res = (LL) res * inv[t[a[x]] + k - c[a[x]] + ] % MOD;
--c[a[x]];
} void Solve(int ql, int qr) {
int mk = (LL) k * m % MOD;
prd[n] = ;
for (int i = n - ; ~i; --i) {
prd[i] = (LL) prd[i + ] * (mk + n - i) % MOD;
}
res = ;
int l = , r = , L, R;
for (int i = ql; i <= qr; ++i) {
L = q[i].l; R = q[i].r;
while (r < R) Inc(++r);
while (l > L) Inc(--l);
while (l < L) Dec(l++);
while (r > R) Dec(r--);
ans[q[i].id] = (LL) res * prd[r - l + ] % MOD;
}
for (int i = l; i <= r; ++i) --c[a[i]];
} int main() {
fac[] = fac[] = ifac[] = ifac[] = inv[] = ;
for (int i = ; i < N; ++i) {
inv[i] = MOD - (LL) (MOD / i) * inv[MOD % i] % MOD;
fac[i] = (LL) fac[i - ] * i % MOD;
ifac[i] = (LL) ifac[i - ] * inv[i] % MOD;
} scanf("%d%d%d", &n, &m, &Q);
for (int i = ; i <= n; ++i) {
scanf("%d", &a[i]);
++t[a[i]];
} for (int i = ; i <= Q; ++i) {
scanf("%d%d%d", &q[i].l, &q[i].r, &q[i].k);
q[i].id = i;
}
sort(q + , q + + Q);
for (int i = , j; i <= Q; i = j + ) {
for (j = i; j < Q && q[j + ].k == q[j].k; ++j);
k = q[i].k;
Solve(i, j);
}
for (int i = ; i <= Q; ++i) {
printf("%d\n", ans[i]);
} return ;
}
【Cf #502 H】The Films(莫队)的更多相关文章
- luogu 1972 小H的项链 莫队
1.莫队算法 TLE 80 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) usi ...
- cf 442 div2 F. Ann and Books(莫队算法)
cf 442 div2 F. Ann and Books(莫队算法) 题意: \(给出n和k,和a_i,sum_i表示前i个数的和,有q个查询[l,r]\) 每次查询区间\([l,r]内有多少对(i, ...
- CF 375D. Tree and Queries【莫队 | dsu on tree】
题意: 一棵树,询问一个子树内出现次数$≥k$的颜色有几种 强制在线见上一道 用莫队不知道比分块高到哪里去了,超好写不用调7倍速度!!! 可以用分块维护出现次数这个权值,实现$O(1)-O(\sqrt ...
- Manthan, Codefest 16 H. Fibonacci-ish II 大力出奇迹 莫队 线段树 矩阵
H. Fibonacci-ish II 题目连接: http://codeforces.com/contest/633/problem/H Description Yash is finally ti ...
- CF 86D 莫队(卡常数)
CF 86D 莫队(卡常数) D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes i ...
- 清橙A1206.小Z的袜子 && CF 86D(莫队两题)
清橙A1206.小Z的袜子 && CF 86D(莫队两题) 在网上看了一些别人写的关于莫队算法的介绍,我认为,莫队与其说是一种算法,不如说是一种思想,他通过先分块再排序来优化离线查询问 ...
- CF 617E【莫队求区间异或和】
E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- Codeforces 765F Souvenirs - 莫队算法 - 链表 - 线段树
题目传送门 神速的列车 光速的列车 声速的列车 题目大意 给定一个长度为$n$的序列,$m$次询问区间$[l, r]$内相差最小的两个数的差的绝对值. Solution 1 Mo's Algorith ...
- E. XOR and Favorite Number 莫队 2038: [2009国家集训队]小Z的袜子(hose)
一直都说学莫队,直到现在才学,训练的时候就跪了 T_T,其实挺简单的感觉.其实训练的时候也看懂了,一知半解,就想着先敲.(其实这样是不好的,应该弄懂再敲,以后要养成这个习惯) 前缀异或也很快想出来 ...
随机推荐
- RabbitMQ入门:主题路由器(Topic Exchange)
上一篇博文中,我们使用direct exchange 代替了fanout exchange,这次我们来看下topic exchange. 一.Topic Exchange介绍 topic exchan ...
- TP里where的查询方式,比如or应该怎么写?
这应该是个基础..只是我没有系统的学TP,所以用到了临时查了手册. 正常来说,thinkphp里的查询方式是: ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用数组或者对象来 ...
- [Codeforces-888C] - K-Dominant Character
C. K-Dominant Character time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- 关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序。
这个问题 将java的和编辑器都换成32位
- Centos7 安装与破解 Confluence 6.7.1
1.1硬件需求建议: CPU:32/64 bit 2.27GHz双核心以上之CPU: 内存:8GB以上: 硬盘:300GB,7200转以上: 建议数据库.Confluence等各自独立一台服务器(本测 ...
- 如何通过阿里云APP进行域名备案?阿里云备案流程需要多久?
如何通过阿里云APP进行域名备案? 1.准备备案材料(很多初次使用阿里云APP进行备案的同学会问备案需要准备哪些资料,不二版本下面就给大家一一列举出来) 个人备案需要材料: ⑴<用户网站备案授权 ...
- MFC -- Excel操作简介(基于VS2010)
一.添加与 Excel 操作相关的头文件 项目 -> 类向导,在右上方有一个下拉栏,选择其中的 类型库中的MFC类(T),即可看到下图所示界面,选择“文件”选项,然后在下方的位置选项中添加本地文 ...
- 使用SSD目标检测c++接口编译问题解决记录
本来SSD做测试的Python接口用起来也是比较方便的,但是如果部署集成的话,肯定要用c++环境,于是动手鼓捣了一下. 编译用的cmake,写的CMakeList.txt,期间碰到一些小问题,简单记录 ...
- 互评Beta版本——可以低头,但没必要——取件帮
基于NABCD评论作品,及改进建议 1. 根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 取件帮是一款有偿互助取件的微信小程序,很大程度上解决了学生因为距离.时间等原因无法取快递的 ...
- Daily Srum 10.22
今天大家的状态比较好,但是还是有很多问题没有解决.首先就是服务器这方面,部分同学还不怎么会用:其次就是看代码出现了困难,不能完整地阅读:还有就是我们的昨天的任务有点困难,部分同学不能按时按量的完成!于 ...