题意:
n个骰子掷出至少k点的概率。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll f[30][4000];
void init()
{
memset(f,0,sizeof(f));
for(int i=1;i<=6;i++)
f[1][i] = 1;
for(int i=1;i<=25;i++) //枚举骰子的个数
{
for(int j=1;j<=6*i;j++) //枚举i个骰子一共掷出的点数
{
for(int k=1;k<=6;k++) //枚举第i+1个骰子掷出的点数
f[i+1][j+k] += f[i][j];
}
}
}
ll gcd(ll x,ll y)
{
return y==0?x:gcd(y,x%y);
}
int main()
{
int n,k;
init();
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==0 && k==0)
break;
if(6*n<k) //如果n个骰子都掷出6都小于k
{
puts("0"); //则n个骰子掷出至少k的概率为0
continue;
}
if(k<=n) //如果n个骰子全部掷出1都大于等于k
{
puts("1"); //则n个骰子掷出至少k的概率为1
continue;
}
ll fz = 0;
for(int i=k;i<=6*n;i++)
fz += f[n][i];
ll fm = 1;
for(int i=1;i<=n;i++) //n个骰子能掷出的可能情况为6^n
fm *= 6;
ll g = gcd(fm,fz);
printf("%lld/%lld\n",fz/g,fm/g);
}
return 0;
}