【agc019F】Yes or No
Description
给你\(n+m\)个询问,其中\(n\)个的答案是\(Yes\),\(m\)个的答案是\(No\),现在依次回答这些询问,每回答一个询问就告诉你听你回答对了还是没对,求最优策略下答对题目期望数量对\(998244353\)取模
Solution
个人感觉很棒的一题qwq
首先我们可以设出一个无脑dp:\(f[n][m]\)表示有\(n\)个\(Yes\)和\(m\)个\(No\)情况下的答案,策略的话当然是哪个剩的多就猜哪个,一样多随便猜一个,那么我们可以得到转移:
\frac{n}{n+m}(f[n-1][m]+1)+\frac{m}{n+m}f[n][m-1]&(n>m)\\
\\
\frac{m}{n+m}(f[n][m-1]+1)+\frac{n}{n+m}f[n-1][m]&(n<m)\\
\\
上面随便选一个(其实就是随便乱猜有\frac{1}{2}的概率有1的贡献)&(n=m)
\end{cases}
\]
然后我们可以将这个东西放到一个。。坐标系里面,横坐标对应\(n\),纵坐标对应\(m\),那么一种回答的方案就相当于从\((n,m)\)出发到\((0,0)\)的一条路径,考虑画一条\(y=x\)的直线,整个坐标系被这条线分成了两大部分,线上方的点都满足\(y>x\),下方则是\(x>y\),那么放回上面的式子里面,先不看概率只看贡献,会发现在下方横向的路径是有贡献的,上方纵向的路径是有贡献的
为了方便下面的描述,我们不妨令\(n>=m\),因为我们的策略中如果一样多就随便猜一个,所以从对角线上点转移出来的答案应该还要乘上\(\frac{1}{2}\)(随便猜有\(\frac{1}{2}\)的概率对,而其他的情况下猜什么是已经确定的了所以可以直接算贡献),这个比较不同所以我们考虑分开,先看那些确定的贡献
先考虑比较简单的\(n=m\)的情况:考虑一条从\((n,n)\)到\((0,0)\)的不碰到对角线的路径,这样的一种方案中所有的边的贡献都是确定的可以直接计算,会发现不管怎么走,每条路径一定会有\(n\)的贡献
那么再看\(n>m\)的情况:考虑一条从\((n,m)\)到\((0,0)\)的路径(可以经过对角线),我们按照触碰对角线的节点将这条路径划分成若干个部分,除了第一部分(也就是从\((n,m)\)走到碰到的第一个对角线上的点的这段)以外,其他部分都可以看成是从对角线上某一个点出发,中途不经过对角线,在对角线上某个点结束的一段路程,其实也就是我们的\(n=m\)的那种情况,而在第一部分中,为了触碰到对角线,一定会横着走\(n-m\)段,也就是一定会有\(n-m\)的贡献,加上前面的那些部分,每条路径一定会有\(n\)的贡献(当\(m>n\)的情况下其实一样的,类似的这个时候就是一定会有\(m\)的贡献了)
所以,我们可以得到一个结论:确定的贡献为\(max(n,m)\),接下来真正受概率影响的就只有那些对角线上的点的贡献了
而这些点的贡献其实也很好计算,只要有一条路径经过对角线上的一个点,那么不管是横着走还是竖着走的,都有\(\frac{1}{2}\)的概率获得\(1\)的贡献,所以我们只要对于对角线上面的每一个点计算经过它的方案数,然后除以总的路径数量,再乘上\(\frac{1}{2}\)即可
mark:没事把这种-1转移的二维dp丢到坐标系里面转成路径什么的好像挺有用的
代码大概长这个样子
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=5*(1e5)+10,MOD=998244353,inv2=499122177;
int fac[N*2],invfac[N*2];
int n,m;
int mul(int x,int y){return 1LL*x*y%MOD;}
int plu(int x,int y){return (1LL*x+y)%MOD;}
int C(int n,int m){return n<m?0:mul(fac[n],mul(invfac[m],invfac[n-m]));}
int calc(int n,int m){return C(n+m,m);}
int ksm(int x,int y){
int ret=1,base=x;
for (;y;y>>=1,base=mul(base,base))
if (y&1) ret=mul(ret,base);
return ret;
}
void prework(int n){
fac[0]=1;
for (int i=1;i<=n;++i) fac[i]=mul(fac[i-1],i);
invfac[n]=ksm(fac[n],MOD-2);
for (int i=n-1;i>=0;--i) invfac[i]=mul(invfac[i+1],i+1);
}
void solve(){
int ans=0;
for (int i=1;i<=min(n,m);++i)
ans=plu(ans,mul(calc(i,i),calc(n-i,m-i)));
ans=mul(ans,ksm(calc(n,m),MOD-2));
ans=mul(ans,inv2);
printf("%d\n",ans+max(n,m));
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
prework(n+m);
solve();
}
【agc019F】Yes or No的更多相关文章
- 【agc019f】AtCoder Grand Contest 019 F - Yes or No
题意 有n个问题答案为YES,m个问题答案为NO. 你只知道剩下的问题的答案分布情况. 问回答完N+M个问题,最优策略下的期望正确数. 解法 首先确定最优策略, 对于\(n<m\)的情况,肯定回 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
随机推荐
- 页码插入JS脚本
(function() { var obj = document.createElement("script"); obj.type = "text/javascript ...
- PSP总结
一.回顾1 (1)回想一下你曾经对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 以前的回答:当初之所以选择计算机专业,是因为我比较喜欢数学,觉得计 ...
- 2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结
2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: ...
- 20172308 实验二《Java面向对象程序设计 》实验报告
20172308 2017-2018-2 <程序设计与数据结构>实验2报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 周亚杰 学号:20172308 实验教师:王 ...
- Go going软件NABCD
N (Need 需求):gogoing项目目前打算做得是一个基于石家庄铁道大学在校大学生对于短期节假日出行旅游的指南.次关键的定义为“简单”.“简单”则体现在我们的软件使用简单.方便,以及界面的简洁 ...
- PAT 1001 A+B Fotmat
源码 1001. A+B Format (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Calcula ...
- “吃神么,买神么”的第二个Sprint计划(计划过程内容)
“吃神么,买神么”项目Sprint计划 ——6.1(第二天)立会内容与进度 团队组员各自任务: 陈键.吴舒婷:继续完善前台设局与布局 林欢雯.冯美欣:开展后台的界面的设计与布局 任务的进度: 陈键. ...
- 【Coursera】主成分分析
一.问题 主方向的概念是什么?为什么降低维度的方法是使方差最大化? 假设某两个特征之间成线性关系,在二维平面上的表示就是数据点呈线性分布,那么可以通过将数据在主方向上进行投影,得到一个一维的数据,这个 ...
- MapReduce编程之Semi Join多种应用场景与使用
Map Join 实现方式一 ● 使用场景:一个大表(整张表内存放不下,但表中的key内存放得下),一个超大表 ● 实现方式:分布式缓存 ● 用法: SemiJoin就是所谓的半连接,其实仔细一看就是 ...
- redis简介及增删改查
redis 是一个文档(nosql)数据库,工作与内存,主要用做高速缓存 缓存经常会查到的数据 存入的值默认是字符串 使用步骤: 1 从redis.io下载 2 点击redis-server.exe启 ...