题解 | #1002.Random Nim Game# 2023杭电暑期多校7

1002.Random Nim Game

诈骗博弈题

题目大意

Nim是一种双人数学策略游戏,玩家轮流从不同的堆中移除棋子。在每一轮游戏中,玩家必须至少取出一个棋子,并且可以取出任意数量的棋子,条件是这些棋子都来自同一个棋子堆。走最后一步棋(即取出最后一块棋子)的人获胜。

现在更改游戏规则,在每个回合中,棋手必须选择一个棋子堆。假设他选择的堆包含 x x x 个棋子,将从 [ 1 , x ] [1,x] [1,x] 中随机一个整数 y y y ,并从堆中移除 y y y 个棋子

求先手获胜的概率,答案取模

解题思路

看起来很吓人的一道题(谁被吓退了我不说)//

考虑只有一个堆的情况

若只有 1 1 1 个棋子,先手必胜

如果有 2 2 2 个棋子,有 1 2 \dfrac{1}{2} 21 的概率拿完获胜,有 1 2 \dfrac{1}{2} 21 的概率余 1 1 1 失败,综合胜率 1 2 \dfrac{1}{2} 21
⋮ \vdots ⋮

如果有 x ( x > 1 ) x\ (x>1) x (x>1) 个棋子,有 n − 2 n \dfrac{n-2}{n} nn−2 的概率转移到 剩余个数 > 1 >1 >1 的状态,有 1 n \dfrac{1}{n} n1 的概率拿完获胜,有 1 n \dfrac{1}{n} n1 的概率余 1 1 1 失败。递归得到 x > 1 x>1 x>1 的状态下的综合胜率为 1 2 \dfrac{1}{2} 21

再考虑多堆的情况

如果所有堆的棋子数量均为 1 1 1 ,则当堆数 n n n 为奇数时先手必胜

如果有某堆的数量多于 1 1 1 个,那么必胜态将以 1 2 \dfrac{1}{2} 21 的概率流转

综上所述,如果所有堆的棋子数量均为 1 1 1 ,则当堆数 n n n 为奇数时先手必胜, n n n 为偶数时先手必败,其余情况综合胜率 1 2 \dfrac{1}{2} 21

参考代码

参考代码为已AC代码主干,其中部分功能需读者自行实现

cpp{.line-numbers} 复制代码
void solve()
{
    ll n;cin >> n;ll mx=0,t;
    FORLL(i,1,n){
        cin >> t;
        mx=max(mx,t);
    }if(mx>1) cout << inv(2) << endl;
    else if(n%2) cout << 1 << endl;
    else cout << 0 << endl;
}
相关推荐
北冥湖畔的燕雀1 小时前
C++泛型编程(函数模板以及类模板)
开发语言·c++
Larry_Yanan6 小时前
QML学习笔记(四十二)QML的MessageDialog
c++·笔记·qt·学习·ui
R-G-B6 小时前
【35】MFC入门到精通——MFC运行 不显示对话框 MFC界面不显示
c++·mfc·mfc运行 不显界面·mfc界面不显示
Madison-No76 小时前
【C++】探秘vector的底层实现
java·c++·算法
晚风残7 小时前
【C++ Primer】第十二章:动态内存管理
开发语言·c++·c++ primer
liu****7 小时前
8.list的模拟实现
linux·数据结构·c++·算法·list
保持低旋律节奏7 小时前
C++ stack、queue栈和队列的使用——附加算法题
c++
初圣魔门首席弟子7 小时前
【C++ 学习】单词统计器:从 “代码乱炖” 到 “清晰可品” 的复习笔记
开发语言·c++
十五年专注C++开发7 小时前
CFF Explorer: 一款Windows PE 文件分析的好工具
c++·windows·microsoft
郝学胜-神的一滴8 小时前
计算机图形学中的光照模型:从基础到现代技术
开发语言·c++·程序人生·图形渲染