public static void Main()
int stardustmin=30; int vortexmin=30; int solarmin=30; int nebulamin=12;
int bars=66; int mechs=3;
int chunkmin=12,chunkmax=20,fragmin=1,barmin=15,fragmax=3,barmax=30;
Console.WriteLine("Difficulty = Expert+");
fragmin=2; barmin=20; fragmax=5; barmax=35;
else Console.WriteLine("Difficulty = Classic");
double[] cumul= new double[(chunkmax*fragmax+1)*2];
double[] exact= new double[(chunkmax*fragmax+1)*2];
double prob=0; cumul[0]=1;
for (int f=1;f<2*(fragmax*chunkmax+1);f++){
cumul[f]=0; exact[f-1]=0;
long[,] fragmatrix=count(chunkmax,f,fragmin,fragmax);
for (int chunks=chunkmin;chunks<chunkmax+1;chunks++){
prob=Convert.ToDouble(fragmatrix[chunks,f-1])/Math.Pow(fragmax-fragmin+1,chunks);
cumul[f]=1-cumul[f]/(chunkmax-chunkmin+1);
exact[f-1]=cumul[f-1]-cumul[f];
Console.WriteLine("Probability of at least "+(fragments)+" fragments from a single pillar = "+100*cumul[fragments]+"%");
int[] p=new int[] {stardustmin,vortexmin,solarmin,nebulamin};
prob=cumul[p[0]]*cumul[p[1]]*cumul[p[2]]*cumul[p[3]];
for (int n=1;n<p[i]+1;n++){
prob=prob+exact[p[i]-n]*cumul[p[(i+1)%4]+n]*cumul[p[(i+2)%4]+n]*cumul[p[(i+3)%4]+n];
Console.WriteLine("Probability of at least "+p[0]+" stardust & "+p[1]+" vortex & "+p[2]+" solar & "+p[3]+" nebula fragments = "+100*prob+"%");
double barprob=Convert.ToDouble(count(mechs,bars,barmin,barmax)[mechs,bars-1])/Math.Pow(barmax-barmin+1,mechs);
Console.WriteLine("Probability of at least "+(bars)+" bars from "+mechs+" mech kills = "+100*(1-barprob)+"%");
public static long[,] count(int trials,int maxsum,int trymin,int trymax){
long[,] matrix = new long[trials+1,maxsum];
for (int b=0;b<trials+1;b++){
for (int m=0;m<maxsum;m++){
matrix[b,m]=Convert.ToInt64(Math.Pow(trymax-trymin+1,b));
while(j<trymax+1 && m>j-1){
matrix[b,m]=matrix[b,m]+matrix[b-1,m-j];