一道经典组合数学+容斥题。

题目传送门:CF1096E

题意简述:

\(p\) 个人,每个人有得分 \(a_i\)。

总得分 \(\sum a_i = s\)。

第一个人得分 \(a_1 \ge r\)。

得分最高的人可以获胜,如果多个人得分最高,则等概率随机其中一个人获胜。

问第一个人获胜的概率。

题解:

第一个人要获胜,他的得分必须是最高分。

考虑枚举第一个人的得分,假设 \(a_1 = x\)。

再枚举总共有几个人得分和第一个人一样(包括第一个人),假设有 \(i\) 个。

那么剩下的 \(p - i\) 个人的得分必须满足 \(a_i < x\),\(\sum a_i = s - ix\)。

也就是说,\(s - ix\) 个无标号小球,放进 \(p - i\) 个有标号盒子中,允许空盒子,每个盒子最多放 \(x - 1\) 个球。

经典的组合问题:\(n\) 个小球放入 \(m\) 个盒子,允许空盒子的方案数为 \(\binom{n + m - 1}{m - 1}\)。

加上了球数不能大于等于 \(x\) 的限制,考虑容斥:

  • 枚举超过限制的盒子数 \(0 \le i \le m\),容斥系数是 \((-1)^i\binom{m}{i}\)。

  • 而 \(i\) 个盒子超过了限制的答案是 \(\binom{n-ix+m-i-1}{m-i-1}\)。

所以答案是 \(\sum\limits_{i=0}^{m}(-1)^i\binom{m}{i}\binom{n-ix+m-i-1}{m-i-1}\)。

总答案是 \(\sum\limits_{x=r}^{s}\sum\limits_{i=1}^{p}\binom{p}{i}\left(\sum\limits_{j=0}^{p-i}(-1)^j\binom{p-i}{j}\binom{n-ix-jx+p-i-j-1}{p-i-j-1}\right)/i\)。

当然这式子太长了,不如封装一下。

注意各种组合数无意义的情况,continue掉就好了。

复杂度 \(O(p^2s)\)。

#include <cstdio>

typedef long long LL;
const int Mod = 998244353; inline int chk(int x) { if (x < 0) x += Mod; if (x >= Mod) x -= Mod; return x; } inline int qPow(int b, int e)
{
int a = 1;
for (; e; b = (LL)b * b % Mod, e >>= 1)
if (e & 1) a = (LL)a * b % Mod;
return a;
} int p, s, r, c[5105][105]; void Init()
{
for (int i = 0; i <= 5100; ++i) c[i][0] = 1;
for (int i = 0; i <= 5100; ++i)
for (int j = 1; j <= i && j <= 100; ++j)
c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % Mod;
} inline int Calc(int n, int m, int x)
{
LL S = 0;
for (int i = 0; i <= m && i * x <= n; ++i)
{
LL s = (LL)c[m][i] * c[n - x * i + m - 1][m - 1] % Mod;
S += i & 1 ? -s : s;
}
return (S % Mod + Mod) % Mod;
} int Sum1, Sum2; int main()
{
scanf("%d%d%d", &p, &s, &r);
if (p == 1) return puts("1"), 0;
Init();
for (int x = r; x <= s; ++x)
{
if (x * p < s) continue;
for (int i = 1; i <= p; ++i)
{
if (i * x > s || (p - i) * (x - 1) + i * x < s)
continue;
if (i == p) { Sum2 = (Sum2 + (i * x == s ? qPow(i, Mod - 2) : 0)) % Mod; continue; }
Sum2 = (Sum2 + (LL)c[p - 1][i - 1] * Calc(s - i * x, p - i, x) % Mod * qPow(i, Mod - 2)) % Mod;
}
}
Sum1 = c[s - r + p - 1][p - 1];
printf("%lld\n", (LL)Sum2 * qPow(Sum1, Mod - 2) % Mod);
return 0;
}

式子也可以写成 \(p!\sum\limits_{x=r}^{s}\sum\limits_{i=1}^{p}\frac{1}{(m-i)!}\binom{n-ix-i-1}{p-i-1}\sum\limits_{j=1}^{i}\frac{(-1)^{i-j}}{(i-j)!}\cdot\frac{1}{j!\cdot j}\)。(惊了,可以卷积)

复杂度可以优化到 \(O(p\log p+sp)\)。(为什么要写

CodeForces 1096E: The Top Scorer的更多相关文章

  1. Codeforces.1096E.The Top Scorer(组合)

    题目链接 感觉这题很裸啊,除了看着恶心点也没什么了,怎么过的人那么少.. \(Description\) 给定\(n,r,s\),表示有\(n\)个人,设每个人的得分是非负整数\(a_i\),已知第一 ...

  2. CF1096E The Top Scorer

    题目地址:洛谷CF1096E 本场AC数最少 (最难) 的题目 题目大意:给出三个数p , s,r,表示有p人,每个人都有一个非负得分,所有人的得分和为s,Hasan的得分至少为r,求Hasan是第一 ...

  3. Educational Codeforces Round 57 (Rated for Div. 2) ABCDEF题解

    题目总链接:https://codeforces.com/contest/1096 A. Find Divisible 题意: 给出l,r,在[l,r]里面找两个数x,y,使得y%x==0,保证有解. ...

  4. Codeforces Educational Codeforces Round 57 题解

    传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑 ...

  5. Educational Codeforces Round 57题解

    A.Find Divisible 沙比题 显然l和2*l可以直接满足条件. 代码 #include<iostream> #include<cctype> #include< ...

  6. Codeforces Educational Round 57

    这场出题人好像特别喜欢998244353,每个题里都放一个 A.Find Divisible 考察选手对输入输出的掌握 输出l 2*l即可(为啥你要放这个题,凑字数吗 #include<cstd ...

  7. 每日英语:A Chinese Soccer Club Has Won Something!

    A 1-1 tie at home was sufficient for Guangzhou Evergrande to clinch the Asian Champions League title ...

  8. Codeforces Round #327 (Div. 1) D. Top Secret Task

    D. Top Secret Task time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  9. Codeforces 590D Top Secret Task

    D. Top Secret Task time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

随机推荐

  1. java与C++相比增加和缺少的特性--持续更新

    缺少的特性 java值类型中没有无符号数 java没有运算符重载语法 java中没有struct和union等用户自定义值类型 java中没有虚函数的概念,所有函数默认具有虚函数的特性 java采用单 ...

  2. c语言基本数据类型(short、int、long、char、float、double)

    一 C 语言包含的数据类型 short.int.long.char.float.double 这六个关键字代表C 语言里的六种基本数据类型. 在不同的系统上,这些类型占据的字节长度是不同的: 在32 ...

  3. CodeForces - 988D(思维STL)

    原文地址:https://blog.csdn.net/weixin_39453270/article/details/80548442 博主已经讲的很好了 题意: 从一个序列中,选出一个集合,使得集合 ...

  4. 关于PHP 时区错误的问题

    php的ini文件中时区配置默认为关闭状态 这会导致调用时间函数时出错,所以要开启时区并且配置自己的时区: 查询手册找到所有的时区有: 所以修改配置为: 重启apache问题解决

  5. 【NOI 2018】冒泡排序(组合数学)

    题意大概是给定一个长度为$n$的排列$p$,求有多少长度为$n$的排列满足冒泡排序的交换次数为$\frac{1}{2} \sum\limits_{i = 1}^{n}|i - p_{i}|$. 可以发 ...

  6. 【uoj219】 NOI2016—优秀的拆分

    http://uoj.ac/problem/219 (题目链接) 题意 一个字符串求它有多少个形如AABB的子串. Solution 其实跟后缀数组里面一个论文题poj3693处理方式差不多吧. 先处 ...

  7. Linux及安全实践五——字符集编码

    Linux及安全实践五——字符集编码 一.ASCII码 在表中查找出英文字母LXQ相对应的十六进制数值为: 4c 58 51 在终端中输入命令:vim test1.txt 在vim页面输入命令:%!x ...

  8. Idea的Maven使用

    使用SSM(Spring,SpringMVC和Mybatis) 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johns ...

  9. [网络流]小M的作物

    小\(M\)的作物(最小割) 做的第一道网络流,因为一个智障错误调了好久嘤嘤嘤 题目描述 小\(M\)在\(MC\)里开辟了两块巨大的耕地\(A\)和\(B\)(你可以认为容量是无穷),现在,小\(P ...

  10. 在阿里云上无法使用mailx发送邮件的解决办法,验证可用。

    由于阿里云已将25端口封了(改用465端口),所以在ECS上往外发邮件时要作相应的配置才行. 使用的是163的企业邮箱,笔记简洁可用. 在阿里云的“安全组”开放645端口通行. 1.安装相应软件包: ...