package com.interview.books.question300;
/**
* Created with IntelliJ IDEA.
* User: stefanie
* Date: 8/4/14
* Time: 1:00 PM
*
*
* Given N sieves, write code to calculate the possibility of each sum of all the sieves number.
* For n<=S<=6n, the number of events is f(S, n)
* f(S,n) = f(S-6, n-1) + f(S-5, n-1) + ... + f(S-1, n-1)
*/
public class TQ15_NSieves {
//p[s][k]: the how many times to get sum = s using k sieves
//initialize: p[i][1] = 1, p[i][i] = 1; p[6*i][i] = 1;
//function: p[s][k] = p[s-6][k-1] + p[s-5][k-1] + .. + p[s-1][k-1]
//result: p[s][k]/6^k
//Time: O(6K^2), Space: O(6K)
public void sumPossibility(int K){
int max = K * 6;
int[] p = new int[max + 1];
for(int s = 1; s <= 6; s++) p[s] = 1;
for(int k = 2; k <= K; k++){
int[] q = new int[max + 1];
q[k] = 1;
q[6 * k] = 1;
for(int s = k + 1; s < 6 * k; s++){
for(int i = (s - 6 < k - 1)? k - 1 : s - 6; i <= s - 1; i++){
q[s] += p[i];
}
}
p = q;
}
double p6 = Math.pow(6, K);
double sum = 0;
for(int i = K; i <= max; i++){
System.out.printf("P(S=%d)=%3f\n", i, (p[i] / p6));
sum += (p[i] / p6);
}
System.out.printf("Total=%3f\n", sum);
}
public static void main(String[] args){
TQ15_NSieves sieves = new TQ15_NSieves();
sieves.sumPossibility(2);
sieves.sumPossibility(3);
}
}