劍指offer-n個骰子的點數

小易參加了一個骰子游戲,這個遊戲須要同時投擲n個骰子,每一個骰子都是一個印有數字1~6的均勻正方體。小易同時投擲出這n個骰子,若是這n個骰子向上面的數字之和大於等於x,小易就會得到遊戲獎勵。小易想讓你幫他算算他得到獎勵的機率有多大。spa

輸入包括兩個正整數n和x(1 ≤ n < 25, 1 ≤ x < 150),分別表示骰子的個數和能夠得到獎勵的最小數字和。
輸出小易能夠得到獎勵的機率。若是機率爲1,輸出1,若是機率爲0,輸出0,其餘以最簡分數(x/y)的形式輸出。
public class Main {
    public static void main(String[] arg) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int x = sc.nextInt();
        int maxVal = 6;
        long[][] count = new long[2][maxVal*n+1];//int 會越界
        int flag =0;
        for(int i=1;i<=maxVal;i++){//第一個骰子
            count[flag][i]=1;
        }
        for(int k=2;k<=n;k++){//第k個篩子
            for(int i=0;i<k;i++){//第k最小點爲k
                count[1-flag][i] = 0;
            }
            for(int i=k;i<=maxVal*k;i++){
                count[1-flag][i] =0;
                for(int j=1;j<=i&&j<=maxVal;j++){
                    count[1-flag][i] += count[flag][i-j];
                }
            }
            flag =1-flag;
        }
        long total = (long)Math.pow(maxVal,n);
        long re = 0;
        for(int i=x;i<=maxVal*n;i++){
            re += count[flag][i];
        }
        long g =gcd(total,re);
        if(re==0){
            System.out.println(0);
        }
        else if(re ==total){
            System.out.println(1);
        }
        else{
            System.out.println(re/g+"/"+total/g);
        }
    }
    public static long gcd(long a,long b){
        return b==0?a:gcd(b,a%b);
    }
}
相關文章
相關標籤/搜索