不难的一题。不知道为什么能 $2500$……

不过场上推错了一直不会优化……

首先考虑 $f_i$ 表示恰好做完前 $i$ 道题的概率。

这样很难算。修改一下,$f_i$ 表示做完至少 $i$ 道题的概率。

答案就是 $\sum\limits_{i=0}^ni(f_i-f_{i+1})=\sum\limits_{i=1}^nf_i$。

由于每道题只可能多用至多一秒,考虑 $dp[i][j]$ 为前 $i$ 道题恰好SB $j$ 次的概率。

初始状态是 $dp[0][0]=1$。转移是 $dp[i][j]=\dfrac{1}{2}(f[i-1][j]+f[i-1][j-1])$。

盯着式子看不难看出 $dp[i][j]=(\dfrac{1}{2})^i\dbinom{i}{j}$。用实际意义也不难理解。

(场上就是这里推成了 $(\dfrac{1}{2})^{i+j}\dbinom{i+j}{i}$ 就自闭了……)

那么有 $f_i=\sum\limits_{j=0}^{r_i}dp[i][j]=(\dfrac{1}{2})^i\sum\limits_{j=0}^{r_i}\dbinom{i}{j}$。其中 $r_i=T-\sum\limits_{j=1}^it_j$,表示最多允许SB几次。(其实要和 $i$ 取个 $\min$,但是不影响,可以想一想为什么)

问题就是求 $\sum\limits_{j=0}^{r_i}\dbinom{i}{j}$ 了。接下来是一个很妙的做法。

首先 $i=1$ 时直接暴力。

然后 $\sum\limits_{j=0}^{r_i}\dbinom{i+1}{j}=\sum\limits_{j=0}^{r_i}(\dbinom{i}{j}+\dbinom{i}{j-1})=2\sum\limits_{j=0}^{r_i}\dbinom{i}{j}-\dbinom{i}{r_i}$。可以直接递推。

由于 $r_i$ 单调递减,递推完之后把 $r_{i+1}+1$ 到 $r_i$ 的组合数都删掉就行了。

实现优秀一点可以做到 $O(n)$。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=,mod=,inv2=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
ll x=,f=;char ch=getchar();
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,t[maxn],fac[maxn],inv[maxn],invfac[maxn],f[maxn],ans,pro=;
ll r[maxn];
int C(int n,ll m){
if(n<m) return ;
return 1ll*fac[n]*invfac[m]%mod*invfac[n-m]%mod;
}
int main(){
n=read();r[]=read();
FOR(i,,n) t[i]=read();
FOR(i,,n) r[i]=r[i-]-t[i];
fac[]=fac[]=inv[]=invfac[]=invfac[]=;
FOR(i,,n){
fac[i]=1ll*fac[i-]*i%mod;
inv[i]=mod-1ll*(mod/i)*inv[mod%i]%mod;
invfac[i]=1ll*invfac[i-]*inv[i]%mod;
}
FOR(i,,min(1ll,r[])) f[]=(f[]+C(,i))%mod;
FOR(i,,n){
if(r[i]<) break;
f[i]=(2ll*f[i-]-C(i-,r[i-])+mod)%mod;
ROF(j,min<ll>(i,r[i-]),r[i]+) f[i]=(f[i]-C(i,j)+mod)%mod;
}
FOR(i,,n){
if(r[i]<) break;
pro=1ll*pro*inv2%mod;
ans=(ans+1ll*pro*f[i])%mod;
}
printf("%d\n",ans);
}

CF1194F Crossword Expert(数论,组合数学)的更多相关文章

  1. Codeforces - 1194F - Crossword Expert - 组合数学

    https://codeforc.es/contest/1194/problem/F 下面是错的. 看起来有点概率dp的感觉? 给你T秒钟时间,你要按顺序处理总共n个事件,每个事件处理花费的时间是ti ...

  2. 【CF1194F】Crossword Expert(数学 期望)

    题目链接 大意 给你\(N\)个事件,解决每个事件所需的时间有\(1/2\)的概率为\(t[i]\),\(1/2\)的概率为\((t[i]+1)\),给你总时间\(T\),在\(T\)时间内按顺序解决 ...

  3. 数论 - 组合数学 + 素数分解 --- hdu 2284 : Solve the puzzle, Save the world!

    Solve the puzzle, Save the world! Problem Description In the popular TV series Heroes, there is a ta ...

  4. HDU 4497 数论+组合数学

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4497 解题思路:将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y' ...

  5. Uva 11076 Add Again (数论+组合数学)

    题意:给你N个数,求把他们的全排列加和为多少 思路:对于这道题,假设数字k1在第一位,然后求出剩下N-1位的排列数num1,我们就可以知道k1在第一位时 排列有多少种为kind1, 同理,假设数字k2 ...

  6. Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field【数论/组合数学】

    B. Ralph And His Magic Field time limit per test 1 second memory limit per test 256 megabytes input ...

  7. Codeforces 223C Partial Sums 数论+组合数学

    题意非常easy,求不是那么好求的,k非常大 要操作非常多次,所以不可能直接来的.印象中解决操作比較多无非线段树 循环节 矩阵 组合数等等吧,这道题目 也就仅仅能多画画什么 的了 就以第一个案例为主吧 ...

  8. Crossword Expert CodeForces - 1194F (期望)

    大意: $n$个题, 按照第$i$题随机$t_i$或$t_i+1$秒钟完成, 最多做$T$秒, 求做题数期望. 期望转为做题数$\ge x$的方案数之和最后再除以总方案数 这是因为$\sum\limi ...

  9. Codeforces 1194F. Crossword Expert

    传送门 考虑每一个位置的期望贡献 $P[i]$ 对于第 $k$ 个位置,设 $sum=\sum_{i=1}^{k}t[k]$,那么 $T-sum$ 即为用最短时间完成完位置 $k$ 后多出来的空闲时间 ...

随机推荐

  1. Ubuntu 16.04 + OpenCV 自定义环境变量 pkg-config / PKG_CONFIG_PATH

    0. 前言 今天在执行一段脚本的时候,爆出错误: Package opencv was not found in the pkg-config search path. Perhaps you sho ...

  2. cmake打印shell

    cmake链接库失败时,可通过打印路径下对应的lib来定位问题 execute_process(COMMAND ls -lt ${CMAKE_CURRENT_SOURCE_DIR}/lib #执行sh ...

  3. matplotlib画图相关

    一. plt显示一副图像 1. import matplotlib.pyplot as plt 2. plt.figure()                    # 图像名称 3. plt.ims ...

  4. Visual Studio 2019 (VS2019)正式版安装 VisualSVN Server 插件

    VS2019 正式版最近刚刚推出来,目前 Ankhsvn 还不支持,它最高只支持 VS2017,全网搜索了一下,也没有找到.在 Stackoverflow 上看了一下,找到这篇问答: 自己按照这种方法 ...

  5. NLP第一课(我也是才开始学)

    闲着无聊的时候,我就会问问自己,编程也有了五年经验了,除了增删改查,我还会什么,有一天我跳槽,去面试的时候,我能比那些年轻而且期望薪资待遇低的年轻毕业生,我有什么优势,而且我只是一个专科的机电系学生, ...

  6. mongodb实现文件存储系统

    前言:这种坑很深呀,要对应mongodb的版本跟php支持的版本,然后,如果要用composer安装第三方的库,一定要一一对应的 正片开始! 开发环境: 系统:window 开发语言:php+apac ...

  7. Java面试题:Java中的集合及其继承关系

    关于集合的体系是每个人都应该烂熟于心的,尤其是对我们经常使用的List,Map的原理更该如此.这里我们看这张图即可: 1.List.Set.Map是否继承自Collection接口? List.Set ...

  8. 面试官都叫好的Synchronized底层实现,这工资开多少一个月?

    本文为死磕Synchronized底层实现第三篇文章,内容为重量级锁实现. 本系列文章将对HotSpot的synchronized锁实现进行全面分析,内容包括偏向锁.轻量级锁.重量级锁的加锁.解锁.锁 ...

  9. 浅谈cookie 和 session

    一. cookie 定义:保存在浏览器本地上的一组组键值对 特点: 由服务器让浏览器进行设置的 浏览器保存在浏览器本地 下次访问时自动携带 应用: 登录 保存浏览习惯 简单的投票 使用cookie的原 ...

  10. elasticsearch7 配置篇

    学习了这么多,终于开始搭建生产环境了,这一篇主要讲解配置项,以及支持中文分词的ik安装,集群的搭建. 配置项确实挺多的,但把几个常用配置熟悉就好,而且就像elasticsearch官方文档所说,不存在 ...