题目大意:抛一个质地均匀的筛子n次,问最后总得分至少为x的概率是多少;
题目解析:定义dp[i][j]表示抛了i次,总得分为j的次数,枚举时dp[i][j]+=dp[i-1][j-k];接下来算一下gcd就ok了;
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
ll cnt[160],dp[26][160];
ll gcd(ll a,ll b)
{
if(b==0) return a;
return gcd(b,a%b);
}
ll pow(int t)
{
ll ans=1;
int i;
for(i=1;i<=t;i++)
ans*=6;
return ans;
}
int main()
{
int cas,c,i,j,k,n,x;
scanf("%d",&cas);
for(c=1;c<=cas;c++)
{
scanf("%d%d",&n,&x);
memset(dp,0,sizeof(dp));
for(i=1;i<=6;i++)
dp[1][i]=1;
for(i=2;i<=n;i++)
{
for(j=2;j<=(6*i>x?x:6*i);j++)
{
for(k=1;k<=6;k++)
if(j-k>=i-1)
dp[i][j]+=dp[i-1][j-k];
}
}
ll ans=0;
for(i=n;i<x;i++)
ans+=dp[n][i];
ll m=pow(n);
ll g=gcd(m,m-ans);
if(ans==0)
{
printf("Case %d: 1\n",c);
continue;
}
if(ans==m)
{
printf("Case %d: 0\n",c);
continue;
}
printf("Case %d: %lld/%lld\n",c,(m-ans)/g,m/g);
}
return 0;
}