题面的简述:总共有$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 = 200005, MOD = 998244353, BLO = 987;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]] + 1) % MOD;
}
void Dec(int x) {if (!x) return;res = (LL) res * inv[t[a[x]] + k - c[a[x]] + 1] % MOD;--c[a[x]];
}void Solve(int ql, int qr) {int mk = (LL) k * m % MOD;prd[n] = 1;for (int i = n - 1; ~i; --i) {prd[i] = (LL) prd[i + 1] * (mk + n - i) % MOD;}res = 1;int l = 1, r = 0, 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 + 1] % MOD;}for (int i = l; i <= r; ++i) --c[a[i]];
}int main() {fac[0] = fac[1] = ifac[0] = ifac[1] = inv[1] = 1;for (int i = 2; i < N; ++i) {inv[i] = MOD - (LL) (MOD / i) * inv[MOD % i] % MOD;fac[i] = (LL) fac[i - 1] * i % MOD;ifac[i] = (LL) ifac[i - 1] * inv[i] % MOD;}scanf("%d%d%d", &n, &m, &Q);for (int i = 1; i <= n; ++i) {scanf("%d", &a[i]);++t[a[i]];}for (int i = 1; i <= Q; ++i) {scanf("%d%d%d", &q[i].l, &q[i].r, &q[i].k);q[i].id = i;}sort(q + 1, q + 1 + Q);for (int i = 1, j; i <= Q; i = j + 1) {for (j = i; j < Q && q[j + 1].k == q[j].k; ++j);k = q[i].k;Solve(i, j);}for (int i = 1; i <= Q; ++i) {printf("%d\n", ans[i]);}return 0;
}

View Code

转载于:https://www.cnblogs.com/Dance-Of-Faith/p/9452060.html

【Cf #502 H】The Films(莫队)相关推荐

  1. 莫队 ---- CF 135D. Jeff and Removing Periods (等差数列预处理 + 莫队)

    题目 题目大意: 给你一个等差序列,每次查询一段区间[l,r][l,r][l,r]的答案. 显然这是典型的不带修改的区间询问类问题,我们可以考虑用莫队算法去解决. 解题思路: 接下来看怎么递推[l,r ...

  2. cf D. Powerful array 莫队算法

    D. Powerful array 题意:给定一个序列>>每次查询一个区间>>查询该区间内 出现过的数字*出现的次数的平方 的和 思路:学习莫队的第一题或者说小z的袜子是第一题 ...

  3. 【打CF,学算法——四星级】CodeForces 86D Powerful array (莫队算法)

    [CF简介] 题目链接:CF 86D 题面: D. Powerful array time limit per test 5 seconds memory limit per test 256 meg ...

  4. CF 617E 莫队

    CF 617E 题目链接: http://codeforces.com/problemset/problem/617/E 题意: 问[L,R]区间内,有多少个子区间,它们里元素的异或和为k. 思路: ...

  5. CodeForces 86 D Powerful array 莫队

    Powerful array 题意:求区间[l, r] 内的数的出现次数的平方 * 该数字. 题解:莫队离线操作, 然后加减位置的时候直接修改答案就好了. 这个题目中发现了一个很神奇的事情,本来数组开 ...

  6. XOR and Favorite Number CF340E 莫队算法

    题目链接 题意:求给定询问区间[L,R]问有多少连续区间异或值等k,多次询问可以离线. a[i]^a[i+1]^a[i+2]^a[n]=(a[1]^a[2]^a[3]^...^a[i-1])^(a[1 ...

  7. Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组

    题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...

  8. bzoj 3339 莫队

    题意: 求任意一个区间的SG函数. 想到线段树,但是线段树合并很麻烦. 线段树--分块. 分块的一个应用就是莫队算法. 怎么暴力递推呢? 从一个区间到另一个区间,Ans 取决于 Ans 和 加入和删除 ...

  9. HDU6964 I love counting (字典树+莫队)

    题意: 给定一个长度为 nnn 的序列c,qc,qc,q 次询问,每次给出l,r,a,bl,r,a,bl,r,a,b求在[l,r][l,r][l,r]中有多少种不同的值 kkk 满足 k⊕a≤b​.k ...

  10. 2021HDU多校第一场 zoto(莫队+分块)

    题意: 给你一个序列,q次询问,每次询问l-r的区间内数字大小为x-y之间内不重复的个,保证数据所有大小为1e5以内. 思路: 比赛的时候通过调整了一下分块的大小和各种优化,用莫队把题目给卡过去了,实 ...

最新文章

  1. java中获取时间的方式,持续更新
  2. 图解SQL Server 存储过程教程一
  3. drupal与html转换,老葛 怎么改变drupal form 生成的html啊 ? | Think in Drupal
  4. mysql基础(二)—— 简单sql
  5. java设计模式系列:单例模式
  6. 获取android设备唯一编号_android 获取手机设备的唯一码(IMIE )
  7. correl函数相关系数大小意义_矩阵的转置的意义
  8. HTML/CSS——子元素相对于父元素固定定位解决方案
  9. .NET平台PE结构分析之Metadata(一)
  10. js模板引擎——art Template
  11. java 7 update 17_Java version 7, Update 17 is NOT recongnized by FireFox version 19.0.2
  12. JavaScript设计模式返璞归真
  13. python2与pyrhon3的区别,python—文件操作,函数练习题
  14. 常用Flex IOC框架比较分析【转载】
  15. 分布式系统研发初体验
  16. AT4RE Patcher v0.6.3使用心得:
  17. 最新Chrome插件开发 api 解析
  18. mysql sphinx windows安装_window下安装sphinx实例
  19. ospf 指定dr_OSPF DR BDR 配置方法2
  20. matlab中多项式拟合如何给出r方,matlap拟合函数后r^2怎么求

热门文章

  1. Python表白代码:“ 星光月夜烟花皆归你,我也归你”
  2. 计数排序CountingSort
  3. 编写高效 TS 代码的一些建议
  4. JS 获取当前浏览器版本,验证浏览器版本是否高于谷歌80
  5. android官网m魅族15,魅族15/Plus/Lite等机型现身Android官网:设计惊艳
  6. 栈溢出 __stack_chk_fail
  7. 触摸屏:Linux输入子系统:多点触控协议
  8. 英语单词默写本的制作
  9. SpringBoot整合Mybatis_plus学习笔记
  10. “龙腾计划”启动!邀请 500 家企业加入,与龙蜥社区一起拥抱无限生态