参考答案:
#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; }