小易參加了一個骰子游戲,這個遊戲須要同時投擲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); } }