问题 A: 【概率】骰子

总在不经意的年生,回首彼岸,纵然发现光景绵长。

题目描述

众所周知,骰子是一个六面分别刻有一到六点的立方体,每次投掷骰子,从理论上讲得到一点到六点的概率都是1/6。今有骰子一颗,连续投掷N次,问点数总和大于等于X的概率是多少?

 

输入

一行两个整数,分别表示n和x,其中1≤N≤24,0≤x<150。

 

输出

一行,一个分数,要求以最简的形式精确地表达出连续投掷N次骰子,总点数大于等于X的概率。如果是0/1就输出0,如果是1/1,就输出1。

 

样例输入

复制样例数据

3 9

样例输出

20/27
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define inf 1000000007
#define wc 1e-8
using namespace std;
typedef long long ll;
ll ksm(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1)
            ans*=a;
        a*=a;
        b>>=1;
    }
    return ans;
}
ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}
ll dp[30][210];
int main(){
    ll fm=0,fz=0,n,x,ls;
    int i,j,k;
    scanf("%lld%lld",&n,&x);
    fm=ksm(6,n);
    dp[0][0]=1;
    for(i=1;i<=n;i++){
        for(j=1;j<=150;j++){
            for(k=1;k<=6;k++){
                if(j-k>=0)
                    dp[i][j]+=dp[i-1][j-k];
            }
        }
    }
    for(i=x;i<=6*n;i++)
        fz+=dp[n][i];
    ls=gcd(fz,fm);
    fz/=ls;
    fm/=ls;
    if(fz==0)
        printf("0\n");
    else if(fm==1)
        printf("%lld\n",fz);
    else
        printf("%lld/%lld\n",fz,fm);
    return 0;
}

 

你可能感兴趣的:(石油大学,ACM)