uva 10759 Dice Throwing

来源:互联网 发布:知乎怎样添加话题 编辑:程序博客网 时间:2024/05/21 12:45

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

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

#include <iostream>#include<stdio.h>#include<cmath>using namespace std;//c[i][j]表示扔i个骰子能得到的和为j的份数,总份数为6^iunsigned 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;}


0 0
原创粉丝点击