【YBT2022寒假Day5 A】序列计数(组合数)(莫队)

序列计数

题目链接:YBT2022寒假Day5 A

题目大意

多组询问,每次给你 l,r,x,问你有多少个序列满足序列长度 m 在 l,r 之间,且序列是一个单调上升序列,最小值大于等于 1,最大值小于等于 x。

思路

我们其实会发现它这个问题就是求 i=lrCxi
(毕竟它就相当于你在 1x 中选 lr 个数,然后排序一下就是一个方案)

然后这个我们先前缀和:i=1rCxii1l1Cxi
然后问题就变成了求 Gxi=i=1yCxi

然后这个感觉就很像可以离线做的那种。
然后你会想到莫队,试着看看它能不能搞。
然后你就会发现这两个东西:
Gxy=Gxy1+Cxy(这个显然)
Gxy=2Gx1yCx1y(大概就是你把 Gxy 里面的每个 Cxi 都拆成 Cx1i+Cx1i1

然后你就可以用莫队搞了。

代码

#include<cstdio> #include<iostream> #include<algorithm> #define ll long long #define mo 998244353 using namespace std; struct node { int l, r, x; }q[200001]; struct Ask { int n, m, pl, op; }qq[400001]; int T, tot, K; ll jc[200001], inv[200001], now, inv2; ll ans[200001]; bool cmp(Ask x, Ask y) { return ((x.n - 1) / K == (y.n - 1) / K) ? x.m < y.m : x.n < y.n; } ll C(ll n, ll m) { return jc[n] * inv[m] % mo * inv[n - m] % mo; } int main() { // freopen("sequence.in", "r", stdin); // freopen("sequence.out", "w", stdout); scanf("%d", &T); for (int i = 1; i <= T; i++) { scanf("%d %d %d", &q[i].l, &q[i].r, &q[i].x); qq[++tot] = (Ask){q[i].x, min(q[i].x, q[i].r), i, 1}; qq[++tot] = (Ask){q[i].x, min(q[i].x, q[i].l - 1), i, mo - 1}; } jc[0] = 1; for (int i = 1; i <= 200000; i++) jc[i] = jc[i - 1] * i % mo; inv[0] = inv[1] = 1; for (int i = 2; i <= 200000; i++) inv[i] = inv[mo % i] * (mo - mo / i) % mo; inv2 = inv[2]; for (int i = 1; i <= 200000; i++) inv[i] = inv[i - 1] * inv[i] % mo; K = 491; sort(qq + 1, qq + tot + 1, cmp); int L = 1, R = 0; now = 1; for (int i = 1; i <= tot; i++) { while (L < qq[i].n) now = (now * 2 - C(L, R) + mo) % mo, L++; while (L > qq[i].n) L--, now = (now + C(L, R)) * inv2 % mo; while (R < qq[i].m) now = (now + C(L, R + 1)) % mo, R++; while (R > qq[i].m) R--, now = (now - C(L, R + 1) + mo) % mo; ans[qq[i].pl] = (ans[qq[i].pl] + now * qq[i].op % mo) % mo; } for (int i = 1; i <= T; i++) printf("%lld\n", ans[i]); return 0; }

__EOF__

本文作者あおいSakura
本文链接https://www.cnblogs.com/Sakura-TJH/p/YBT2022Day5_A.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   あおいSakura  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2021-02-11 【ybt高效进阶3-4-3】【luogu P2272】最大半连通子图
点击右上角即可分享
微信分享提示