当前位置:   article > 正文

牛客——小红又战小紫(概率dp和逆元)

牛客——小红又战小紫(概率dp和逆元)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

小红上次输给了小紫,表示不服,于是又约来小紫来玩一个游戏。
这次是取石子游戏:共有nnn堆石子,两人轮流使用以下两种技能中的一种进行取石子:
1. 随机选择某一堆石子,取走其中的一颗石子。
2. 每一堆石子各取走一颗石子。

小红先手,谁先取完所有的石子谁获胜。两人都希望自己的获胜概率尽可能高,假设两人都绝顶聪明,请你计算小红最终获胜的概率。

 

  1. #include <iostream>
  2. using namespace std;
  3. const int N = 1010, mod = 1e9 + 7;
  4. int n;
  5. int c[3]; //记录石子数为1的石子堆数和石子数为2的石子堆数
  6. int f[N];
  7. int qmi(int x, int k) //快速幂求逆元
  8. {
  9. int res = 1;
  10. while (k) {
  11. if (k & 1)
  12. res = (long long)res * x % mod;
  13. x = (long long)x * x % mod;
  14. k >>= 1;
  15. }
  16. return res;
  17. }
  18. int main()
  19. {
  20. cin >> n;
  21. for (int i = 1; i <= n; i++) {
  22. int x;
  23. cin >> x;
  24. c[x]++;
  25. }
  26. //dp处理过程
  27. f[0] = 1;
  28. for (int i = 0; i <= n; i++) {
  29. for (int j = 1; j <= i; j++) {
  30. //题目要求输出的是和逆元有关,这里把除法写为逆元
  31. f[j] = ((long long)(i - j) * qmi(i, mod - 2) % mod * ((1 - f[j] + mod) % mod) % mod +
  32. (long long)j * qmi(i, mod - 2) % mod * ((1 - f[j - 1] + mod) % mod) % mod) %
  33. mod;
  34. }
  35. }
  36. //输出答案
  37. cout << f[c[2]] << endl;
  38. return 0;
  39. }

题解见:牛客周赛 Round 29 F.小红又战小紫【概率dp】_小红上次输给了小紫,表示不服,于是又约来小紫来玩一个游戏。这次是取石子游戏:共-CSDN博客

逆元见:求逆元的三种方法-CSDN博客

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读