[题解] AT_abc_f Socks 4
题目大意
抽屉里有 \(n\) 种颜色的袜子,其中第 \(i\) 种颜色的袜子有 \(a_i\) 只。
最初,高桥把一只颜色为 \(c\) 的袜子放在抽屉外面,与这些袜子分开,然后重复下面的操作,直到满足终止条件为止:
- 从抽屉中统一随机抽出 \(1\) 只袜子。然后,如果抽屉外的两只袜子颜色相同,则终止操作。否则,选择其中一只袜子放回抽屉。他在选择放回抽屉的袜子时,总是尽量减少未来抽袜子的预期次数。
求期望操作次数除以 \(998244353\) 的余数。
当这个值表示为不可约分数 \(\frac{P}{Q} (Q \gt 0)\) 时,我们有 \(Q \not\equiv 0 \pmod{998244353}\) 。
因此,唯一存在一个满足 \(R \times Q \equiv P \pmod{998244353}, 0 \leq R < 998244353\) 的整数 \(R\) 。求模为 \(998244353\) 的期望值就是求 \(R\)。
思路
求期望,十有八九是dp了。
设 \(dp_i\) 表示抽屉外的袜子颜色为 \(i\) 时,结束游戏的预期次数,\(a_i\) 表示第 \(i\) 中袜子的个数,\(tot=\sum{a_i}-1\) 为抽屉里袜子总数。
如果抽到了两只袜子 \(i,j\),我们要放回那个袜子?
- 如果 \(a_i\lt a_j\),把 \(i\) 放回去,因为 \(i\) 数量更多,更有概率抽中另一只一样颜色的袜子。单个贡献为 \(\frac{a_j}{tot}\),一共有 \(dp_i\) 次,总贡献为 \(\frac{a_j}{tot}\times dp_i=\frac{a_j\cdot dp_i}{tot}\)。
- 如果 \(a_i=a_j\),游戏结束。贡献为 \(0\)
- 如果 \(a_i\gt a_j\),把 \(j\) 放回去,同理。贡献为 \(\frac{a_j}{tot}\times dp_j=\frac{a_j\cdot dp_j}{tot}\)。
这样子,\(dp_i = 1 + \displaystyle\sum_{j = 1}^{i-1} \frac{a_j\cdot dp_i}{tot} + \sum_{j = i + 1}^{n} \frac{a_j\cdot dp_j}{tot}\)。这里 \(1\) 表示拿一次,答完一次后把两种情况加起来。
移项得:\((1 - \displaystyle\sum_{j = 1}^{i-1} \frac{a_j}{tot}) dp_i = 1 + \sum_{j = i + 1}^{N} \frac{a_j\cdot dp_j}{tot}\),就是 \(dp_i=\frac{1 + \displaystyle\sum_{j = i + 1}^{N} \frac{a_j\cdot dp_j}{tot}}{1 - \displaystyle\sum_{j = 1}^{i-1} \frac{a_j}{tot}}\)。
但是时间复杂度是 \(\mathcal{O}(n^2)\)。
由于计算的瓶颈在于 \(\displaystyle\sum_{j=1}^{i-1} \frac{a_j}{tot}\) 和 \(\displaystyle\sum_{j = i + 1}^{n} \frac{a_j\cdot dp_j}{tot}\) ,如果这两个值的值分别为 \(x\) 和 \(y\) ,那么在计算 \(dp_{i-1}\) 之前,我们可以从 \(x\) 中减去 \(\frac{a_{i - 1}}{tot}\) ,再在 \(y\) 中加上 \(\frac{a_i\cdot dp_i}{tot}\) 。这样就能动态维护了。
注意:如果按 \(a_i\) 升序时求 \(dp_i\),则要知道 \(dp_{i+1\sim n}\),那么就要倒着求。但是如果 \(a_i\) 降序,就只需要正着求即可。
做法
将 \(a_i\) 倒序,每次动态维护 \(x,y\),因为有除法,所以考虑使用逆元。
代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define pi pair<int, int>
// #pragma GCC optimize(2)
using namespace std;
const int INF = INT_MAX;
const int mod = 998244353;
const int N = 3e5 + 10;
int qpow(int a, int b) {
a %= mod;
int ans = 1;
while (b) {
if (b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans % mod;
}
int n, c, a[N], dp[N];
// dp[i]表示持有第i种袜子时,需要操作的次数
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> c;
int tot = 0, st = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
tot += a[i];
if (i == c) a[i]++, st = a[i]; // c颜色多一个袜子
}
sort(a + 1, a + 1 + n, greater<int>());
int s = 0, sa = 0; // s维护sum{a_i/tot},sa维护sum{a_i*dp_i/tot}
for (int i = 1; i <= n; i++) {
if (i == 1)
dp[i] = tot * qpow(a[1] - 1, mod - 2) % mod;
else
dp[i] = (sa + tot) * qpow(s + a[i] - 1, mod - 2) % mod;
sa = (sa + dp[i] * a[i] % mod) % mod;
s = (s + a[i]) % mod;
}
for (int i = 1; i <= n; i++)
if (a[i] == st) return cout << dp[i] << endl, 0;
return 0;
}
[题解] AT_abc_f Socks 4的更多相关文章
- Codeforces Round #376 (Div. 2) C题 Socks(dsu+graphs+greedy)
Socks Problem Description: Arseniy is already grown-up and independent. His mother decided to leave ...
- HDU6043 17多校1 KazaQ's Socks 水题
题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=6043 Problem Description KazaQ wears socks everyday. ...
- 湖南大学ACM程序设计新生杯大赛(同步赛)G - The heap of socks
题目描述 BSD is a lazy boy. He doesn't want to wash his socks, but he will have a data structure called ...
- 【25.23%】【codeforces 731C】Socks
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- CF731C Socks
CF731C Socks 洛谷评测传送门 题目描述 Arseniy is already grown-up and independent. His mother decided to leave h ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
随机推荐
- 凯撒密码--java实现
关于凯撒密码的介绍我就不多说了,感兴趣的可以看什么是凯撒密码?,我主要说的是java如何实现. 我发现网上有写java加密解密的,写的时候发现只需要一个转换函数就可以了,可以作为加密用,也可以用作解密 ...
- 数据库连接池 - Pymysql
最近想用小程序来做个移动BI, 然后涉及后端接口部分打算用 Python 的 flask 框架整一波, 主要听闻它比较轻量, 简单和可灵活配置, 这就和我很对味. 毕竟我主要搞数据用的就是 sql 而 ...
- Pytorch 看起来好像没占gpu的样子的原因
今天好哥们儿赞助的3080到手了,欣喜若狂的装上 然后跑了跑MNIST,看着任务管理器CPU跑100%,GPU跑3%,查了半天解决不了,郁闷了好一会儿.. 后来在https://www.bilibil ...
- Django Formsets总结
formset是将多个表单用在同一个页面上的抽象层. 我们有: from django import forms class ArticleForm(forms.Form): title=forms. ...
- PHP MD5强碰撞
MD5强碰撞 搬得这个师傅的 https://www.cnblogs.com/kuaile1314/p/11968108.html 可以看到,使用了三个等号,这个时候PHP会先检查两边的变量类型,如果 ...
- 洛谷 P3792 由乃与大母神原型和偶像崇拜
洛谷 P3792 由乃与大母神原型和偶像崇拜 Problem 糖果屋的故事讲的就是韩赛尔和格雷特被继母赶出家里,因为没饭吃了,然后进了森林发现了一个糖果屋,里面有个女巫,专门吃小孩子 然而如果我们仔细 ...
- Castle Defense
你需要最大化被数量最少的弓箭手保护的墙被弓箭手保护的数量.想到什么,对了,二分答案. 对 $check$ 函数进行思考. 令答案为 $m$. 如果一个点的值小于 $m$,则考虑将其变成 $m$,那么将 ...
- 从理解AI到驾驭文字:一位技术爱好者的写作工具探索手记
三年前,当我第一次接触AI写作工具时,它生成的文字还带着明显的机械感,段落间的逻辑时断时续.如今,这些系统已经能写出颇具文采的散文,甚至模仿特定作家的风格.这种进化轨迹恰好为学习者提供了一个观察AI发 ...
- 给Markdown渲染网页增加一个目录组件(Vite+Vditor+Handlebars)(下)
1 引言 在上一篇文章<给Markdown渲染网页增加一个目录组件(Vite+Vditor+Handlebars)(上)>中笔者介绍了如何实现在Markdown渲染网页中加一个目录组件.不 ...
- 鸿蒙运动项目开发:封装超级好用的 RCP 网络库(下)—— 实战应用
鸿蒙核心技术##运动开发## Remote Communication Kit(远场通信服务) 在之前的文章中,我们详细介绍了如何封装一个功能完备的 RCP 网络库,并探讨了其核心功能和高级特性.在本 ...