http://codeforces.com/problemset/problem/1096/E

题意:

一场游戏有p人参加,得分总和为s分,每个人的分数都是非负整数,且其中一号玩家的得分至少为r

而现在不知道具体的得分情况,求一号玩家获胜的概率,我们认为任何一种合法的得分情况出现的概率相等

得分最高的玩家获胜,特殊的,若有多人得分相同,他们获胜的几率相同

1≤p≤100,0≤r≤s≤5000,要求答案对998244353取模


这题考试的时候连暴力都没想出来555

看题解后,感觉到了一种套路。。。

设 g(s,p,m)=(在一场总分和s,玩家数p的游戏中,没有人得分超过m的合法状态数)

这东西dp起来蛮简单(的吧?),但是你会发现他的复杂度有点难以接受。。。但这至少给我们一个启示?

  • 遇到获胜等设计随机状态中涉及最大值的问题,可以试着转化成一些“不超过”问题的组合

我们试着用数学方法解决这个问题吧

这个 这个公式出自隔板法和容斥原理,请允许我解释一下

首先看容斥,简单来说就是想计算 所有情况-至少一个人超过m+至少两个人超过m-至少三个人超过m……

然后看隔板法,如何计算有i个人超过m呢?先选出i个人C(p,i),给每个人先分配m+1个,就变成了箱子内剩余数可以为零的经典隔板问题

这个式子在有预处理的帮助下的代价是O(p)

有了g之后呢,答案f貌似就很好计算了,搬个公式大家自己体会吧~

总复杂度:O(s*p2)

 1 #include<cstdio>
 2 #define ll long long
 3 #define mod 998244353
 4 using namespace std;
 5 ll ksm(ll x,ll t){ll ans=1;for(;t;t>>=1,x=(x*x)%mod)if(t&1)ans=(ans*x)%mod;return ans;}
 6 int p,s,r;
 7 ll fac[6005],invf[6005];
 8 void pre(){
 9     fac[0]=1;
10     for(int i=1;i<=p+s;i++)fac[i]=(fac[i-1]*i)%mod;
11     invf[p+s]=ksm(fac[p+s],mod-2);
12     for(int i=p+s-1;i>=0;i--)invf[i]=(invf[i+1]*(i+1))%mod;
13 }
14 ll C(ll n,ll m){
15     if(n<0||m<0||m>n)return 0;
16     return ((fac[n]*invf[n-m])%mod*invf[m])%mod;
17 }
18 ll ans;
19 ll g(ll s,ll p,ll m){
20     if(p==0&&s==0)return 1;
21     ll tot=0;
22     for(int i=0,t=1;i<=p;i++){
23         tot+=t*(C(p,i)*C(s+p-1-i*(m+1),p-1)%mod);
24         tot=(tot+mod)%mod;
25         t*=-1;
26     }
27     return tot;
28 }
29 int main(){
30     scanf("%d%d%d",&p,&s,&r);
31     pre();
32     for(int t=r;t<=s;t++)
33     for(int q=1;q<=p;q++){
34         ans+=((C(p-1,q-1)*ksm(q,mod-2)%mod)*g(s-q*t,p-q,t-1))%mod;
35         ans%=mod;
36     }
37     ans*=ksm(C(s+p-1-r,p-1),mod-2);
38     ans%=mod;
39     printf("%lld",ans);
40     return 0;
41 }

View Code

转载于:https://www.cnblogs.com/2017SSY/p/10207411.html

CF1096E The Top Scorer相关推荐

  1. Top 50 Most Popular APIs on RapidAPI (2018)

    You may be asking yourself: "What are the most popular and used APIs out there?" Ready to ...

  2. java 读取word 带格式_java读取word带格式_游戏下载_游戏攻略资讯_尽在搜狗爱玩

    Started learning Java and think you're ready to move on to the next level? Find out if you have a go ...

  3. 足球相关的英文专业术语(持续更新中...Ctrl+F可直接进行搜索)

    技术 long pass 长传 close pass, short pass 短传 flank pass 边线传球 high lobbing pass 高吊传球 scissor pass 交叉传球 v ...

  4. 【CF套题】Educational Codeforces Round 57

    [前言] 打了小号,做到心态爆炸,虽然最后过了6T. 然而十分后悔为什么没有用大号打,大号打就上橙了qwq. [题目] 原题地址 A.Find Divisible 输出lll和2l2l2l即可. #i ...

  5. Linux shell 学习笔记(2)— 监测程序、磁盘空间和处理文件(ps -ef、top、kill、df、du 、grep、tar)

    1. 监测程序 1.1 检查进程 默认情况下,ps 命令只会显示运行在当前控制台下的属于当前用户的进程. $ ps PID TTY TIME CMD 3081 pts/0 00:00:00 bash ...

  6. Linux top命令常见使用

    使用方法 top 常见使用 h:显示帮助画面,给出一些简短的命令总结说明: k:终止一个进程: i:忽略闲置和僵死进程,这是一个开关式命令: q:退出程序: r:重新安排一个进程的优先级别: S:切换 ...

  7. linux top cpu核数查看,Linux怎么查看CPU核数?

    在Linux中,可以使用"cat /proc/cpuinfo| grep "cpu cores"| uniq"来查看CPU核数,即每个物理CPU中core的个数 ...

  8. 竞赛|数据竞赛Top解决方案开源整理

    今天分享一份数据竞赛Top解决方案开源的整理,如果大家想要从之前的竞赛中获取经验的话,可以多看看这些竞赛的开源方案: 1.纯数据竞赛 2018科大讯飞AI营销算法大赛 Rank1:https://zh ...

  9. 用v-for循环动态定位坐标显示元素,并遍历元素的left和top坐标位置(只需要用到元素的宽高、索引、每行显示数量)

    v-for="(index,$i) in total" :key="$i":style="{left:`${itemWidth*((index-1)% ...

最新文章

  1. HTTP Header 详解,互联网营销
  2. python从txt拿取数据_python requests + xpath 获取分页详情页数据存入到txt文件中
  3. 设计模式六大原则(3)——依赖倒置原则
  4. 滑动窗口1——无重复字符的最长字串
  5. RigUp 数据库暴露7.6万份美国能源行业文件
  6. 中关村海龙大厦-买本上当经历给大家提个醒
  7. java file 字典查询_File listFiles
  8. python cursor函数_执行从python返回cursor的db2plsql函数
  9. Atitit 大脑能够储存多大的数据量
  10. 用C语言写的爬虫项目
  11. 数学之美:《社交网络》中Facemash算法分析
  12. 痱子的预防和治疗方法
  13. luogu1378 油滴扩展 (深搜)
  14. 使用stream流进行集合排序取最大值,根据集合中的bigdemal属性排序(正序反序)并取最大值
  15. 程序员必知必会网络传输之TCP/IP协议族,共864页的详解文档让你原地起飞!
  16. 然爸读书笔记(2013-2)----格鲁夫给经理人的第一课
  17. 获取linux命令硬盘信息,Linux 下使用命令获取硬盘信息
  18. 老式录像带VHS信号故障毛刺干扰特效AE/PR插件 Signal v1.2.3
  19. 深度神经网络(DNN)的反向传播算法总结与图解
  20. feawfwefwf

热门文章

  1. 使用jsp实现word、excel格式报表打印-JSP教程,Jsp/Servlet
  2. Git 的特点—— Git 学习笔记 02
  3. rabbitMq简介及docker安装
  4. MPU6050开发 -- 卡尔曼滤波
  5. PM2.5检测 -- PMS7003 串口测试
  6. 魔兽世界 服务器维护,魔兽世界8.0:服务器崩溃紧急维护三小时 网易这次得背大锅!...
  7. 自己动手利用KVM和Intel VT实现简单虚拟机
  8. 【译】Getting Started With Ethereum and Building a Basic Dapp — Part 2
  9. 使用Node.js部署智能合約(Smart Contract)
  10. Android Telephony分析(二) ---- RegistrantList详解