AT传送门

洛谷传送门

题目大意

抽屉里有 \(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的更多相关文章

  1. 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 ...

  2. HDU6043 17多校1 KazaQ's Socks 水题

    题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=6043 Problem Description KazaQ wears socks everyday. ...

  3. 湖南大学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 ...

  4. 【25.23%】【codeforces 731C】Socks

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. CF731C Socks

    CF731C Socks 洛谷评测传送门 题目描述 Arseniy is already grown-up and independent. His mother decided to leave h ...

  6. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  7. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  8. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  9. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  10. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

随机推荐

  1. 决策单调性DP

    决策单调性DP是一个非常重要的DP类别.在决策点随枚举点增加单调不降时,可以有效地优化复杂度. 一般而言,决策点指的是对于一个 \(f[i]\),它的值需要从另一个值j中转移,而对于所有j,令 \(f ...

  2. Go 层级菜单树转 json 处理

    本篇是一个补充知识点, 目的是为了下篇的后台管理系统中, 菜单权限的接口进行铺垫一下. 同时也是做个笔记, 因为在很多地方都会用这种 "树结构" 来实现很多权限, 层级, 菜单的处 ...

  3. 集成学习双雄:Boosting和Bagging简介

    在机器学习的世界里,集成学习(Ensemble Learning)是一种强大的技术,它通过组合多个模型来提高预测性能. 集成学习通过组合多个基学习器的预测结果,获得比单一模型更优秀的性能.其核心思想是 ...

  4. RPC实战与核心原理之优雅关闭

    优雅关闭:如何避免服务停机带来的业务损失? 上线的大致流程 当服务提供方要上线的时候,一般是通过部署系统完成实例重启.在这个过程中,服务提供方的团队并不会事先告诉调用方他们需要操作哪些机器,从而让调用 ...

  5. Palindrome Number——LeetCode进阶路⑨

    //原题链接https://leetcode.com/problems/palindrome-number/ 题目描述 Determine whether an integer is a palind ...

  6. AI工程师跑路了-怎么办?

    ​ 从雪山飞狐到百年孤独 百无聊赖中翻开了又一本金庸的小说<雪山飞狐>,江湖侠气,快意恩仇瞬间跃然纸上,唯有最后胡斐那一刀才让读者回到了现实.之前刚读了<明朝那些事儿>,最后重 ...

  7. http协议中长连接和短连接介绍

      TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,客户端与服务器端之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时可以释放这个连接.连接的建立依靠"三次握手& ...

  8. CF1928G Vlad and Trouble at MIT

    CF1928G Vlad and Trouble at MIT Vlad and Trouble at MIT Problem MIT的学生宿舍可以用一棵有\(n\)个顶点的树来表示,每个顶点代表一个 ...

  9. AI编码焕新:用Context7

    最近,一款名为 Context7 MCP 的工具备受瞩目.网络上流传着各种说法,比如它解决了大语言模型的痛点.革新了 AI 编码方式,甚至能让 Cursor 效率提升十倍.那么,Context7 真有 ...

  10. 一种通用的arduino通信例程

    本教程将给出一种通用的,适用于arduino(uno和mega等)单片机的一个通信的教程,通过对例程的修改,可以做成任意的符合需求的代码,下面请看. // 函数定义 String detectStri ...