uva 10759 Dice Throwing

首先打表得到每个和所占的份数,然后约分。因为分母(6^i i表示骰子个数)的质因数为2和3,所以只要对2和3进行约分即可。

注意无符号数的输出格式。

#include <iostream>
#include<stdio.h>
#include<cmath>
using namespace std;

//c[i][j]表示扔i个骰子能得到的和为j的份数,总份数为6^i
unsigned long long c[30][160];
void table()
{
    for(int i = 1; i <= 6; i++) c[1][i] = 1;
    for(int i = 2; i <=24; i++)
        for(int k = 1; k <= 6; k++)
            for(int j = 1; j < 150; j++)
                if(c[i - 1][j])
                    c[i][j+k]+=c[i-1][j];
}

int main()
{
    table();
    int n,x;
    unsigned long long ans1,ans2;
    while(scanf("%d %d",&n,&x),n+x)
    {
        if(n>=x) printf("1\n");
        else if(n*6 < x) printf("0\n");
        else
        {
            ans1 = 0;
            for(int i = x;i<150;i++)
            {
                ans1+=c[n][i];
            }
            ans2 = (unsigned long long)pow(6,n);
            while(ans1%2==0 && ans2%2 ==0){ans1/=2;ans2/=2;}
            while(ans1%3==0 && ans2%3 == 0){ans1/=3;ans2/=3;}
            printf("%llu/%llu\n",ans1,ans2);
        }
    }
    return 0;
}


你可能感兴趣的:(uva 10759 Dice Throwing)