题意:给定色子数n和总和x,求n个色子掷出的总和大于等于x的概率,用p/q形式输出
解析:
基本方法就是求出掷出总和大于等于x的方案数,然后除以总和6^n;
方案数求法很容易想到DP来求,设f[i][j]表示i个色子掷出总和为j的方案数,
转移方程f[i][j]=Σ(f[i-1][j-k])(1<=k<=6)
//其中pow 需要重写,cmath 中的pow求出来会有偏差
<span style="font-size:18px;color:#333333;">#include <iostream>
#include <cstdio>
#include <cstring>
#define ll __int64
using namespace std;
ll gcd(ll a,ll b)
{
if(b==0)return a;
return gcd(b,a%b);
}
ll pow(ll x,ll y)
{
ll ans=1;
for(int i=1;i<=y;i++)
ans*=x;
return ans;
}
ll k,t,n,x,ans;
ll f[30][160],p,q;
int main()
{
scanf("%lld",&t);k=0;
while(t--)
{
scanf("%lld%lld",&n,&x);
memset(f,0,sizeof(f));
for(int i=1;i<=6;i++)f[1][i]=1;
for(int i=2;i<=n;i++)
for(int j=2;j<=(i*6>x?x:i*6);j++)
{
for(int l=1;l<=6;l++)
if(j-l>=i-1)f[i][j]+=f[i-1][j-l];
}
ans=0;k++;printf("Case %lld: ",k);
for(int i=n;i<x;i++)ans+=f[n][i];
p=gcd(pow(6,n)-ans,pow(6,n));
q=pow(6,n)/p;p=(pow(6,n)-ans)/p;
if(q==1)printf("%lld\n",p);
else printf("%lld/%lld\n",p,q);
}
return 0;
}</span>