打一局吗(60pts 解法)

news/2025/9/23 21:13:22/文章来源:https://www.cnblogs.com/Starpop/p/19108088

打一局吗

题目描述

Diaoyeye 作为健美先生,自然会受到很多人的挑战,nyx 便是他们中的一位。 nyx 具有自知之明,他知道 Diaoyeye 比他健美的多,和他刚正面显然不行,于是 要求 Diaoyeye 和他打牌。

nyx 制定的游戏规则是这样的:一副只有黑白两种颜色的牌,从背面看都是一样, 两个人轮流取牌堆顶的一张牌,如果谁先取到了黑色牌谁就获胜。同时 nyx 还请了 pupil 来捣乱,pupil 会在两个人取完牌后把牌堆顶的一张牌拿走,但是不会给 nyx 和 Diaoyeye,不论pupil 这张牌是黑色牌还是白色牌,都把它作废。所以有可能 nyx 和 Diaoyeye 都没有抽到黑色牌,判为平局。

nyx 通过一些手段知道了牌堆里黑色牌和白色牌的数量,然后他想知道先手获胜概率和后手获胜概率,然后考虑是不是快点投降。

输入描述

输入包括一行,两个正整数 \(a\)\(b\),表示黑色牌和白色牌的数量。

输出描述

输出包括两个整数,用空格隔开,分别表示先手获胜的概率和后手获胜的概率,用乘法逆元的形式输出,对 \(1004535809\) 取模。

输入输出样例 #1

样例输入 #1

1 3

样例输出 #1

502267905 753401857

输入输出样例 #2

样例输入

3 1

样例输出

251133953 753401857

说明/提示

样例#1解释

先手取到黑色牌,先手赢。

先手取到白色牌,后手取到黑色牌,后手赢。

先手取到白色牌,后手取到白色牌,pupil取到白色牌,先手取到黑色牌,先手赢。

先手取到白色牌,后手取到白色牌,pupil取到黑色牌,先手取到黑色牌,平局。

先手获胜的概率是0.5,取模之后是502267905。

后手获胜概率是0.25,取模之后是753401857。

数据范围和约定

对于 \(20\)% 的数据,\(1\leq a,b\leq 10\)

对于 \(60\)% 的数据,\(1\leq a,b\leq 2000\)

对于 \(100\)% 的数据,\(1\leq a,b\leq 10000\)

有关数学公式

\(p\) 为质数,则 \(\forall a \in \N_+\)\(a^{p-1} \equiv 1 \pmod{p}\)

解题报告

好吧,一道基础的概率 DP,但是需要一些优化的技巧。

我们对先手和后手分别计算,设 \(i\) 表示黑牌的个数,\(j\) 表示白牌的个数,\(f_{i,j}\) 表示先手获胜概率,\(g_{i,j}\) 表示后手获胜概率。

随带一提,一开始用记忆化搜索的思路常常会好想很多。

对于先手获胜,有以下情况:

  1. \(i \geq 1\),先手摸到黑牌,概率 \(\dfrac {i}{i+j}\)
  2. \(j\geq3\),先手摸到白牌,后手摸到白牌,第三者摸到白牌,概率 \(\dfrac{j}{i+j} \times \dfrac{j-1}{i+j-1} \times \dfrac{j-2}{i+j-2} \times f_{i,j-3}\)
  3. \(j \geq 2\),先手摸到白牌,后手摸到白牌,第三者摸到黑牌,概率 \(\dfrac{j}{i+j} \times \dfrac{j-1}{i+j-1} \times \dfrac{i}{i+j-2} \times f_{i-1,j-2}\)

对于后手获胜,有以下情况:

  1. \(i \geq 1,j\geq 1\),先手摸到白牌,后手摸到黑牌,概率 \(\dfrac{j}{i+j} \times \dfrac{i}{i+j-1}\)
  2. \(j\geq3\),先手摸到白牌,后手摸到白牌,第三者摸到白牌,概率 \(\dfrac{j}{i+j} \times \dfrac{j-1}{i+j-1} \times \dfrac{j-2}{i+j-2} \times g_{i,j-3}\)
  3. \(j \geq 2\),先手摸到白牌,后手摸到白牌,第三者摸到黑牌,概率 \(\dfrac{j}{i+j} \times \dfrac{j-1}{i+j-1} \times \dfrac{i}{i+j-2} \times g_{i-1,j-2}\)

dp 转移到这就完了,以下是用记忆化搜索实现的无逆元的版本:

double dfsF(int x,int y)
// 先手胜率
{if(f[x][y]==-1) return f[x][y];if(!x) return 0;       // 没有黑了,平局if(x && !y) return 1;  // 只有黑了,必赢f[x][y]=(double)x/(x+y);// 先后手都抽到白if(y>=2){double tmp=( (double)y/(x+y) )*( (double)(y-1)/(x+y-1) );// 先后手都抽到白的概率,枚举第三者的抽牌可能if(y>=3) f[x][y]+=tmp*dfsF(x,y-3)*( (double)(y-2)/(x+y-2) ); // 白if(x>=1) f[x][y]+=tmp*dfsF(x-1,y-2)*( (double)x/(x+y-2) );   // 黑}return f[x][y];
}double dfsG(int x,int y)
// 后手胜率
{if(g[x][y]==-1) return g[x][y];if(!x) return 0;        // 没有黑了,平局if(x && !y) return 0;   // 只有黑了,必输g[x][y]=( (double)y/(x+y) )*( (double)x/(x+y-1) );// 先手抽到白的同时,后手抽到黑if(y>=2)// 先后手都抽到白{double tmp=( (double)y/(x+y) )*( (double)(y-1)/(x+y-1) );// 先后手都抽到白的概率,枚举第三者的抽牌可能if(y>=3) g[x][y]+=tmp*dfsG(x,y-3)*( (double)(y-2)*(x+y-2) ); // 白if(x>=1) g[x][y]+=tmp*dfsG(x-1,y-2)*( (double)x/(x+y-2) );   // 黑}return g[x][y];
}

但是,这题要求逆元,所以我们要将所有的除法改成乘上逆元的形式。

用线性递推的方法求出需要的所有逆元就好了,为什么这要写是对的,我也不知道(doge)。

inline void GetInv(int n)
{inv[1]=1;for(int i=2;i<=n;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}int dfsF(int x,int y)
// 先手胜率
{if(f[x][y]!=-1) return f[x][y];if(!x) return 0;       // 没有黑了,平局if(x && !y) return 1;  // 只有黑了,必赢f[x][y]=x*inv[x+y]%mod;// 先后手都抽到白if(y>=2){int tmp=( y*inv[x+y]%mod )*( (y-1)*inv[x+y-1]%mod )%mod;// 先后手都抽到白的概率,枚举第三者的抽牌可能if(y>=3) f[x][y]=( f[x][y]+tmp*dfsF(x,y-3)%mod*( (y-2)*inv[x+y-2]%mod )%mod )%mod; // 白if(x>=1) f[x][y]=( f[x][y]+tmp*dfsF(x-1,y-2)%mod*( x*inv[x+y-2]%mod )%mod )%mod;   // 黑}return f[x][y]%mod;
}int dfsG(int x,int y)
// 后手胜率
{if(g[x][y]!=-1) return g[x][y];if(!x) return 0;        // 没有黑了,平局if(x && !y) return 0;   // 只有黑了,必输g[x][y]=( y*inv[x+y]%mod )*( x*inv[x+y-1]%mod )%mod;// 先手抽到白的同时,后手抽到黑if(y>=2)// 先后手都抽到白{int tmp=( y*inv[x+y]%mod )*( (y-1)*inv[x+y-1]%mod )%mod;// 先后手都抽到白的概率,枚举第三者的抽牌可能if(y>=3) g[x][y]=( g[x][y]+tmp*dfsG(x,y-3)%mod*( (y-2)*inv[x+y-2]%mod )%mod )%mod; // 白if(x>=1) g[x][y]=( g[x][y]+tmp*dfsG(x-1,y-2)%mod*( x*inv[x+y-2]%mod )%mod )%mod;   // 黑}return g[x][y]%mod;
}

这个时候,程序的正确性就有保证了,但是,这题的 \(a\)\(b\) 可以达到 \(10000\),数组开不下,时间复杂度也无法接受!!!

怎么办?

一个常用的方法:用循环数组。这是由于我们发现:关于 \(i\) 的一维只会由 \(i-1\) 递推而来,这提供了使用循环数组的可能。

不过用循环数组就不能用记忆化搜索了,要改成递推形式。

inline void GetInv(int len)
{inv[1]=1;for(int i=2;i<=len;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}signed main()
{GetInv(n+m);for(int i=1;i<=m;i++) f[0][i]=0;f[0][0]=f[1][0]=1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){f[i%2][j]=i*inv[i+j]%mod;if(j>=2){int tmp=( j*inv[i+j]%mod )*( (j-1)*inv[i+j-1]%mod )%mod;if(j>=3) f[i%2][j]=( f[i%2][j]+tmp*f[i%2][j-3]%mod*( (j-2)*inv[i+j-2]%mod )%mod )%mod;if(i>=1) f[i%2][j]=( f[i%2][j]+tmp*f[(i-1)%2][j-2]%mod*( i*inv[i+j-2]%mod )%mod )%mod;}}for(int i=1;i<=m;i++) g[0][i]=0;g[0][0]=g[1][0]=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){g[i%2][j]=( j*inv[i+j]%mod )*( i*inv[i+j-1]%mod )%mod;if(j>=2){int tmp=( j*inv[i+j]%mod )*( (j-1)*inv[i+j-1]%mod )%mod;if(j>=3) g[i%2][j]=( g[i%2][j]+tmp*g[i%2][j-3]%mod*( (j-2)*inv[i+j-2]%mod )%mod )%mod;if(i>=1) g[i%2][j]=( g[i%2][j]+tmp*g[(i-1)%2][j-2]%mod*( i*inv[i+j-2]%mod )%mod )%mod;}}
}

还是很好该的。

但是很遗憾,这样虽然解决的空间问题,但是时间复杂度依然很大,这个程序只有 \(60\text{pts}\)

(目前笔者想不出优化的方法,先在此结文,等待教练讲解)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/913901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软工9.23

今天学习了原码反码补码,原码将除符号位的其他位变成相反的数,再加一就成了补吗,创建补码的原因是统一零的唯一性,零由于符号位的存在,是不统一的,统一加法运算,如果去判断符号位来进行加减的话,运算量会变大。…

本地部署qwen-0.6b

导入需要的库 打开pycharm的终端(是终端不是python程序),下载下面的库pip install torch transformers datasets peft accelerate sentencepiece modelscope pip install modelscope pip3 install torch torchvisi…

门户网站建设方高校网站站群

在动态变化的IT环境中&#xff0c;故障预防与快速响应成为了运维管理的关键。监控易作为一体化运维监控平台&#xff0c;凭借其智能告警和精准定位的特性&#xff0c;为运维团队提供了强有力的支持&#xff0c;确保了IT系统的稳定运行。本文将深入探讨监控易在故障预警和快速定…

设计企业门户网站做网站有什么建议

题图来自溪源2017年拍摄的照片。弃码而去1那是2015年的一天。下午5点40&#xff0c;我收拾完手头上的工作&#xff0c;准备关机回家时&#xff0c;qq上突然弹出的窗口吸引了我的注意。“源哥&#xff0c;我能跟你聊一下么&#xff1f;”我点开一看&#xff0c;发现给我发消息的…

手机网站技术方案西安制作手机网站

Google Colab(Colaboratory) 是一个免费的云端环境&#xff0c;旨在帮助开发者和研究人员轻松进行机器学习和数据科学工作。它提供了许多优势&#xff0c;使得编写、执行和共享代码变得更加简单和高效。Colab 在云端提供了预配置的环境&#xff0c;可以直接开始编写代码&#x…

wordpress yeti 主题谷歌sem和seo区别

购买阿里云服务器 到[阿里云官网]&#xff0c;选择轻量应用服务器&#xff0c; 步骤如图所示&#xff1a; 地域随便选择哪一个&#xff0c;镜像的话&#xff0c;对比了CentOS&#xff0c;Debian&#xff0c;Ubuntu&#xff0c;我最终选择了CentOS&#xff0c;因为流行嘛&…

卖房子上哪个网站最好卖湖南网络营销

今日在地铁上浏览今日头条的时候看到这么个小题目&#xff0c;说是输出一长串字符串&#xff0c;输出字母串类别并且统计其出现次数&#xff0c;然后按照顺序将其输出来。例如输入aaaabbbcccccc&#xff0c;输出a4b3c6。 最近也一直在学习&#xff0c;所以就想着就Matlab来试了…

成都网站制作公司保险网站程序源码

一、前言 本系列如无特殊说明使用的虚幻版本都是5.2.1&#xff0c;VS为2022版本。在Unity中通常创建的脚本都默认继承了MonoBehavior&#xff0c;都是不能再用代码New而实例化的&#xff0c;虚幻也是一样不能直接New来实例化。在Unity中是通过Instantiate方法来实例化一个游戏对…

网站的导航栏淄博网站建设招聘

&#xff08;7&#xff09;积木画 题目&#xff1a; 小明最近迷上了积木画, 有这么两种类型的积木, 分别为 &#xfffd;I 型&#xff08;大小为 2 个单位面积) 和 &#xfffd;L 型 (大小为 3 个单位面积): 同时, 小明有一块面积大小为 2&#xfffd;2N 的画布, 画布由 2&am…

明星静态网站建立属于自己的网站

在本文章之前&#xff0c;应该了解的概念&#xff1a; 连接的一些概念、NLJ、BNL、HashJoin算法。 目录关于join连接probe行保存概念Hashjoin执行流程&#xff08;十分重要&#xff09;HashJoinIterator成员函数讲解1、BuildHashTable2、ReadNextHashJoinChunk3、ReadRowFromPr…

用啥网站做首页qq企业邮箱登录

使用OpenSSL生成自签名SSL/TLS证书和私钥 前提&#xff1a; 系统安装了OpenSSL&#xff1b; 系统&#xff1a;windows、linux都可&#xff1b; 1 生成私钥 创建一个名为 server.key 的私钥文件&#xff0c;并使用 RSA 算法生成一个 2048 位的密钥。 openssl genrsa -out s…

做app的模板下载网站有哪些内容百度指数有什么作用

1.Linux目录结构 Linux与Windows不同&#xff0c;Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面 2.Linux路径的描述方式 在Linux系统中&#xff0c;路径之间的层级关系&#xff0c;使用&#xff1a;/ 来表示 在Windows系统中&#xff0c;路径之间的层级关系…

华亭网站建设网站建设经费

数字化转型已成为当下企业发展的必经之路&#xff0c;而生成式AI作为这场变革的强力引擎&#xff0c;正逐渐展现出其无与伦比的价值。今天&#xff0c;我们将深入探讨生成式AI在日志整理、数据清晰、产品设计等方面的应用&#xff0c;揭示它如何为数字化转型注入强大动力&#…

重庆网站自己推广外包网站该怎么做帐

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「154」篇原创敬上大家好&#xff0c;我是Z哥。在工作中&#xff0c;你会发现有的小伙伴每天看上去很忙&#xff0c;但是好像产出的成果比旁边看上去工作轻松甚至有…

装修公司做自己网站wordpress仿站实战

模板的&#xff1a; 关键思想是&#xff1a; 当pattern遇到*时&#xff0c;需要考虑两种情况&#xff1a; str的当前字符和pattern的*前的字符相同&#xff0c;例如str“ab”&#xff0c;pattern“abb*”&#xff0c;“b”和“b*”相同&#xff0c;有两种情况可以选择&#xf…

网站建设案例如何长沙市做网站的

Problem - 1883C - Codeforces 这题当时想复杂了。 题目大意&#xff1a; 给一串数组和一个数字k&#xff0c;求对数组进行多少次操作能是他们的乘积是k的倍数。 操作是选定一个数加上1。 这题需要抓住一个点k属于[2,5]&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5中…

做线下活动的网站口碑营销的作用

博主在打游戏时喜欢切后台但是最近发现切屏尤其慢&#xff0c;异常卡顿&#xff0c;但是是新换的电脑&#xff0c;所以苦恼了半天&#xff0c;上网搜也没有结果&#xff0c;说的都是些配置低&#xff0c;系统文件损坏等问题&#xff0c;所以再检查分辨率时发现问题所在 屏幕分辨…

免费地方网站宜城网站开发

说明一下这个三级页表的查询&#xff0c;会需要上面的L2,L1,L0 如果在二级页表level就是2&#xff0c;PGSHIFT是12&#xff0c;那么就是往左移129*2位置&#xff0c;在&9bit就得到L2&#xff0c;其他以此类推 也表查询&#xff0c;首先有跟页表的地址pagetable&#xff0c;…

最好的企业网站源码宁波网站优化公司软件

认识 HTML HTML 是超文本标记语言 开发环境 VScode and Chrome VScode 快捷键 ctrl b隐藏侧边栏shift alt f自动整理格式shift alt 向下箭头将当前选中的内容&#xff0c;复制一份并粘贴到下面! Tab键自动补全HTML骨架 VScode 快速开发技巧 Emmet 写法&#xff1a…