赞
踩
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
小红上次输给了小紫,表示不服,于是又约来小紫来玩一个游戏。
这次是取石子游戏:共有nnn堆石子,两人轮流使用以下两种技能中的一种进行取石子:
1. 随机选择某一堆石子,取走其中的一颗石子。
2. 每一堆石子各取走一颗石子。
小红先手,谁先取完所有的石子谁获胜。两人都希望自己的获胜概率尽可能高,假设两人都绝顶聪明,请你计算小红最终获胜的概率。


- #include <iostream>
- using namespace std;
-
- const int N = 1010, mod = 1e9 + 7;
- int n;
- int c[3]; //记录石子数为1的石子堆数和石子数为2的石子堆数
- int f[N];
-
- int qmi(int x, int k) //快速幂求逆元
- {
- int res = 1;
- while (k) {
- if (k & 1)
- res = (long long)res * x % mod;
- x = (long long)x * x % mod;
- k >>= 1;
- }
- return res;
- }
-
- int main()
- {
- cin >> n;
- for (int i = 1; i <= n; i++) {
- int x;
- cin >> x;
- c[x]++;
- }
-
- //dp处理过程
- f[0] = 1;
- for (int i = 0; i <= n; i++) {
- for (int j = 1; j <= i; j++) {
- //题目要求输出的是和逆元有关,这里把除法写为逆元
- f[j] = ((long long)(i - j) * qmi(i, mod - 2) % mod * ((1 - f[j] + mod) % mod) % mod +
- (long long)j * qmi(i, mod - 2) % mod * ((1 - f[j - 1] + mod) % mod) % mod) %
- mod;
- }
- }
- //输出答案
- cout << f[c[2]] << endl;
- return 0;
- }

题解见:牛客周赛 Round 29 F.小红又战小紫【概率dp】_小红上次输给了小紫,表示不服,于是又约来小紫来玩一个游戏。这次是取石子游戏:共-CSDN博客
逆元见:求逆元的三种方法-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。