骰子概率

 

 

参考答案:

#include <bits/stdc++.h>  
#include <algorithm>
#define ll unsigned long long
using namespace std;

ll dp[1005][1005]; //定义数组大小   意义为抛n枚硬币,点数和为x的方案数

int gcd(int a, int b)      //自定义函数:欧几里得辗转相除法求最大公约数
{
  if (b == 0) return a;
  return gcd(b, a%b);
}
int main()
{
  ll n, k, i, j, m;
  cin >> n >> m;
  dp[0][0] = 1;
  for (i = 0; i < n; i++)  //外层循环:i从0到n-1表示抛第i枚硬币
  {
    for (j = 0; j <= i * 6; j++) //中层循环:j从0到i*6(骰子最大值为6,投两枚为2*6即12)
    {
      for (k = 1; k <= 6; k++) dp[i + 1][j + k] += dp[i][j]; //内层循环:k从1到6
    }
  }
  ll ans = 0, temp = 1;
  for (i = m; i <= 6 * n; i++) ans += dp[n][i];
  for (i = 0; i < n; i++) temp *= 6;
  if (ans%temp == 0)   //输出部分利用了最大公约数来输出标准分数,如果是整数则输出整数
  { 
    cout << ans / temp << endl; return 0;
  }
  
  ll t = gcd(ans, temp);
  cout << ans / t << "/" << temp / t << endl;
  system("pause");
  return 0;
}

 

发表评论

邮箱地址不会被公开。 必填项已用*标注

16 + 10 =