CodeForces 1096E: The Top Scorer
一道经典组合数学+容斥题。
题目传送门: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的更多相关文章
- Codeforces.1096E.The Top Scorer(组合)
题目链接 感觉这题很裸啊,除了看着恶心点也没什么了,怎么过的人那么少.. \(Description\) 给定\(n,r,s\),表示有\(n\)个人,设每个人的得分是非负整数\(a_i\),已知第一 ...
- CF1096E The Top Scorer
题目地址:洛谷CF1096E 本场AC数最少 (最难) 的题目 题目大意:给出三个数p , s,r,表示有p人,每个人都有一个非负得分,所有人的得分和为s,Hasan的得分至少为r,求Hasan是第一 ...
- 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,保证有解. ...
- Codeforces Educational Codeforces Round 57 题解
传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑 ...
- Educational Codeforces Round 57题解
A.Find Divisible 沙比题 显然l和2*l可以直接满足条件. 代码 #include<iostream> #include<cctype> #include< ...
- Codeforces Educational Round 57
这场出题人好像特别喜欢998244353,每个题里都放一个 A.Find Divisible 考察选手对输入输出的掌握 输出l 2*l即可(为啥你要放这个题,凑字数吗 #include<cstd ...
- 每日英语: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 ...
- 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 ...
- Codeforces 590D Top Secret Task
D. Top Secret Task time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- P4867 Gty的二逼妹子序列
题目描述 Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们规定妹子们的美 ...
- eclipse 重装了tomcat后配置路径
在Windows->Preferences->Server->Runtime Environments把先前的工程Servers删除掉
- mybatis plugin作为一款优秀的mybatis跳转插件
阅读目录: 1. 简介2. 下载mybatis plugin插件3. 安装mybatis plugin插件4. 启动并验证5.说明1. 简介 mybatis plugin作为一款优秀的mybatis跳 ...
- UVA.10791 Minimum Sum LCM (唯一分解定理)
UVA.10791 Minimum Sum LCM (唯一分解定理) 题意分析 也是利用唯一分解定理,但是要注意,分解的时候要循环(sqrt(num+1))次,并要对最后的num结果进行判断. 代码总 ...
- 使用Dom4解析xml
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便. XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为 ...
- Android Studio & eclipse 调试技巧
如上图设置多个断点,开启调试.想跨断点移动到下一个断点,点击如下图1箭头,程序将运行一个断点到下一个断点之间需要执行的代码.如果后面代码没有断点,再次点击该按钮将会执行完程序.点击箭头2指向的按钮,可 ...
- ASP.NET MVC API 接口验证
项目中有一个留言消息接口,接收其他系统的留言和展示留言,参考了网上的一些API验证方法,发现使用通用权限管理系统提供的验证方法最完美(http://www.cnblogs.com/jirigala/p ...
- EMF的安装及用例
转: EMF的安装及用例 本人正在开发专门针对计算机视觉领域的DSL(这是一个和某公司合作的项目),欢迎各位朋友一起交流学习! 一.简介 EMF是一个建模框架和代码生成工具,用于构建基于结构化数据模型 ...
- pre-processing预处理
什么是神经网络?神经网络是由很多神经元组成的,首先我们看一下,什么是神经元1.我们把输入信号看成你在matlab中需要输入的数据,输进去神经网络后2.这些数据的每一个都会被乘个数,即权值w,然后这些东 ...