传送门

解题思路

  首先将这个模型放到坐标轴上,\(x\)轴表示\(1\),\(y\)轴表示\(0\)。问题就转化成了从\((0,0)\)走到\((n,m)\),每次可以猜测向\(x\)轴或向\(y\)轴,而实际也有一条路线,求猜中的个数的期望。假设\(n<m\)首先如果一直猜\(m\),答案必然为\(m\),那么这是答案的下界。再考虑过\((n,m)\)做一条斜率为\(1\)的直线,如果在直线上,那么猜中的概率其实就为\(\frac{1}{2}\)。,而不在坐标轴上猜中的期望其实就为\(m\)。那么现在就是求走到直线的概率,根据期望的线性,可以考虑直线上每一个点产生的贡献,过这个点的路线就可以用组合数轻松算出了。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std;
const int N=1000005;
const int MOD=998244353;
typedef long long LL; int n,m,fac[N],inv[N];
int Ans1,Ans2; //LL gcd(LL x,LL y) {
// if(!y) return x;
// return gcd(y,x%y);
//}
//
//struct Data{
// LL x,y;
// Data(LL _x=0,LL _y=0) {x=_x; y=_y;}
// friend Data operator+(const Data A,const Data B){
// Data ret; ret.y=A.y*B.y; ret.x=A.x*B.y+A.y*B.x;
// LL tmp=gcd(ret.x,ret.y); ret.x/=tmp; ret.y/=tmp;
// return ret;
// }
// friend Data operator*(const Data A,const Data B){
// Data ret; ret.x=A.x*B.x; ret.y=A.y*B.y;
// LL tmp=gcd(ret.x,ret.y); ret.x/=tmp; ret.y/=tmp;
// return ret;
// }
//}ans; inline int fast_pow(int x,int y){
int ret=1;
for(;y;y>>=1){
if(y&1) ret=(LL)ret*x%MOD;
x=(LL)x*x%MOD;
}
return ret;
} inline int C(int x,int y){
return (LL)fac[x]*inv[y]%MOD*inv[x-y]%MOD;
} int main(){
scanf("%d%d",&n,&m);
if(n>m) swap(n,m); fac[0]=inv[0]=1;
for(int i=1;i<=n+m;i++) fac[i]=1ll*fac[i-1]*i%MOD;
inv[n+m]=fast_pow(fac[n+m],MOD-2);
for(int i=n+m-1;~i;i--) inv[i]=1ll*inv[i+1]*(i+1)%MOD;
Ans1=1ll*2*m*C(n+m,n)%MOD; Ans2=fast_pow(C(n+m,n)*2%MOD,MOD-2);
for(int i=1;i<=n;i++) {
Ans1=Ans1+1ll*C(n-i+m-i,n-i)*C(i+i,i)%MOD;
Ans1%=MOD;
}
printf("%lld\n",1ll*Ans1*Ans2%MOD);
// ans=ans+Data(1,2)*Data(C(n-i+m-i,n-i)*C(i+i,i),C(n+m,n));
// printf("%lld\n",1ll*ans.x*fast_pow(ans.y,MOD-2)%MOD);
return 0;
}

AT2705 Yes or No(组合数学)的更多相关文章

  1. poj 3734 Blocks 快速幂+费马小定理+组合数学

    题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...

  2. 组合数学or not ---- n选k有重

    模板问题: 1. 取物品 (comb.pas/c/cpp) [问题描述] 现在有n个物品(有可能相同),请您编程计算从中取k个有多少种不同的取法.[输入] 输入文件有两行,第一行包含两个整数n,k(2 ...

  3. 组合数学(全排列)+DFS CSU 1563 Lexicography

    题目传送门 /* 题意:求第K个全排列 组合数学:首先,使用next_permutation 函数会超时,思路应该转变, 摘抄网上的解法如下: 假设第一位是a,不论a是什么数,axxxxxxxx一共有 ...

  4. uestc1888 Birthday Party    组合数学,乘法原理

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=25539#problem/G 题目意思: 有n个人,每个人有一个礼物,每个人能拿 ...

  5. UVA 11076 Add Again 计算对答案的贡献+组合数学

    A pair of numbers has a unique LCM but a single number can be the LCM of more than one possiblepairs ...

  6. POJ3252——Round Number(组合数学)

    Round Numbers DescriptionThe cows, as you know, have no fingers or thumbs and thus are unable to pla ...

  7. HDU4675【GCD of scequence】【组合数学、费马小定理、取模】

    看题解一开始还有地方不理解,果然是我的组合数学思维比较差 然后理解了之后自己敲了一个果断TLE.... 我以后果然还得多练啊 好巧妙的思路啊 知识1: 对于除法取模还需要用到费马小定理: a ^ (p ...

  8. hdu 4810 Wall Painting (组合数学+二进制)

    题目链接 下午比赛的时候没有想出来,其实就是int型的数分为30个位,然后按照位来排列枚举. 题意:求n个数里面,取i个数异或的所有组合的和,i取1~n 分析: 将n个数拆成30位2进制,由于每个二进 ...

  9. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

随机推荐

  1. 测开之路七十三:用kafka实现消息队列之环境搭建

    一:装java环境,确保java能正确调用 kafka下载地址:http://kafka.apache.org/downloads 下载并解压kafka: 新建两个文件夹,用于存放zookeeper和 ...

  2. SqlSession 内部运行

    <深入浅出MyBatis技术原理与实战>p150页 SqlSession内部运行图 四大对象在流程中的操作. 1.准备sql.StatementHandler 的prepare方法进行sq ...

  3. 关于 推广QQ

    有一个项目 需要在用户提交表单之后,关闭页面,微信公众号发送一个模板消息,链接地址为qq推广的链接. 早上在试 先是在电脑端测试都是正常的. 然后开始上传到服务器端测试,发送模板消息之前的动作,都没有 ...

  4. 【BASIS系列】SAP 设置系统timeout时间

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BASIS系列]SAP 设置系统timeout ...

  5. 如何在Python中使用Linux epoll

    如何在Python中使用Linux epoll 内容 介绍 阻塞套接字编程示例 异步套接字和Linux epoll的好处 epoll的异步套接字编程示例 性能考量 源代码 介绍 从2.6版开始,Pyt ...

  6. git不能先commit后再pull

    本文首发hilsion的博客 今天遇到一个在使用git上的一个误区.具体的问题现象是: 我commit后再pull而不能在本地合并的情况,结果导致我的commit直接把同事的修改覆盖了.因为相对于我此 ...

  7. Thread -线程的两种创建方式

    package cn.learn.thread.Thread; /* 实现Runnable必须重写run()方法,一般推荐用Runnable实现 */ public class RunnableImp ...

  8. word中迅速将表格一分为二 拆分表格快捷键ctrl+shift+enter 重复上一个命令快捷键f4

    这里说的是将一个表格拆分为两个表格 选择要拆分的行,快捷键ctrl+shift+enter,就拆分为两个表格了,是不是很快! 在多个表格需要拆分的时候,做一次这样的操作,然后不停的移动.F4,就可以了 ...

  9. mysql: "Warning: Using a password on the command line interface can be insecure." 解决方法

    错误重现: 命令行或者shell脚本中执行以下命令,如果您当前服务器mysql版本是大于5.6的,则会出现警告:Warning: Using a password on the command lin ...

  10. Pandas matplotlib 无法显示中文

    Pandas 无法显示中文问题 解决方案 Pandas在绘图时,会显示中文为方块,主要原因有二:   matplotlib 字体问题seaborn 字体问题 (实际上,matplotlib是支持uni ...