LightOJ 1064 Throwing Dice(概率)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1064

题意:一次掷n个筛子,求点数之和大于m的概率。

思路:f[i][j]表示前i个筛子点数之和为j的概率,由此DP即可。不过这道题不用每次都乘以六分之一,因为n个筛子最后的分母是6^n,所以最后除以6^n即可。

 

 #include <iostream>

 #include <cstdio>

 #include <cstring>

 #define int64 unsigned long long

 using namespace std;

  

  

  

 int64 f[30][160],p[30];

 int C,num=0;

 int n,m;

  

 void init()

 {

     int i,j,k;

     p[0]=1;

     for(i=1;i<=24;i++) p[i]=p[i-1]*6;

     for(i=1;i<=6;i++) f[1][i]=1;

     for(i=2;i<=24;i++) for(j=i-1;j<=(i-1)*6;j++) for(k=1;k<=6;k++)

        f[i][j+k]+=f[i-1][j];

     for(i=1;i<=24;i++) for(j=i*6;j>=0;j--) f[i][j]+=f[i][j+1];

 }

  

 int64 Gcd(int64 a,int64 b)

 {

     return !b?a:Gcd(b,a%b);

 }

  

 int main()

 {

     init();

     for(scanf("%d",&C);C--;)

     {

         scanf("%d%d",&n,&m);

         printf("Case %d: ",++num);

         int64 a=p[n],b=f[n][m],c=Gcd(a,b);

         a/=c;

         b/=c;

         if(a==1) printf("%llu\n",b);

         else printf("%llu/%llu\n",b,a);

     }

     return 0;

 }

 

  

 

 

 

 

你可能感兴趣的:(throw)