#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <stdint.h>
#include <sys/time.h>

#define LRAND(s) \
(((s) = (s) * 41943011 - 2147483647) >> 32)


void Usage(void){
	printf("Usage:\n");
	printf("./hits times percentage\n");
}


int main(int argc, char **argv){
	// (N+5) (N+4) (N+3) (N+2) (N+1) / 120
	int times = 0;
	double percen = 0;
	double result = 0;
	int n1 = 0;
	int n2 = 0;
	int n3 = 0;
	int *sim;
	int sim_res = 0;
	struct timeval cur;
	gettimeofday(&cur, NULL);
	uint64_t rseed = (uint64_t)cur.tv_usec + 3;
	uint32_t rand1 = LRAND(rseed) % 2;
	uint32_t rets[1000];
	uint32_t val1 = 0;
	uint32_t val2 = 0;

	if(argc != 3){
		printf("wrong usage!\n");
		Usage();
		exit(1);
	}
	times = atoi(argv[1]);
	percen = atof(argv[2]);

	sim = malloc(sizeof(int)*times);

	printf("Chance atleast one hit:\n");
	printf("times:\t %%\t sim%%(1000x)\n");
	for(n1=0; n1<times; n1++){
		result = 1 - pow((100-percen)/100, n1+1);

		val2 = percen;
		for(n2=0; n2<1000; n2++){
			for(n3=0; n3<n1+1; n3++){
				val1 = LRAND(rseed) % 100;
				sim[n3] = (val2>val1)?1:0;
			}
			for(n3=0; n3<n1+1; n3++){
				if(sim[n3]){
					rets[n2] = 1;
					break;
				}
				//else
				rets[n2] = 0;
			}
		}
		val1 = 0;
		val2 = 0;
		for(n2=0; n2<1000; n2++){
			if(rets[n2])
				val1++;
			else
				val2++;
		}
		printf("%d\t %lf %lf\n", n1+1, result*100, (double)val1/1000*100);
	}
	percen /= 100;
	printf("Chance all hits:\n");
	printf("times:\t %% sim%%(1000x)\n");
	for(n1=0; n1<times; n1++){
		result = pow(percen, n1+1);

		val2 = percen*100;
		for(n2=0; n2<1000; n2++){
			for(n3=0; n3<n1+1; n3++){
				val1 = LRAND(rseed) % 100;
				sim[n3] = (val2>val1)?1:0;
			}

			rets[n2] = 1;
			for(n3=0; n3<n1+1; n3++){
				if(sim[n3] != 1){
					rets[n2] = 0;
					break;
				}
			}
		}
		val1 = 0;
		val2 = 0;
		for(n2=0; n2<1000; n2++){
			if(rets[n2])
				val1++;
			else
				val2++;
		}

		printf("%d\t %lf %lf\n", n1+1, result*100, (double)val1/1000*100);
	}

/*
	//SIMULATE IT
	struct timeval cur;
	gettimeofday(&cur, NULL);
	uint64_t rseed = (uint64_t)cur.tv_usec + 3;
	uint32_t rand1 = LRAND(rseed) % 2;
	uint32_t rets[1000];
	uint32_t val1 = 0;
	uint32_t val2 = 0;


	percen *= 100;
	val2 = percen;
	for(n1=0; n1<1000; n1++){
		val1 = LRAND(rseed) % 100;

		//val1 = LRAND(rseed) % (uint32_t)percen;
		//val2 = LRAND(rseed) % (uint32_t)100-percen;
		if(val1 < val2)
			rets[n1] = 1;
		else
			rets[n1] = 0;
	}
	n2 = 0;
	for(n1=0; n1<1000; n1++){
		if(rets[n1] == 1)
			n2++;
	}
	printf("hits: %u misses: %u\n", n2, 1000-n2);

//1-(4/6)^1 = 1/3
//pow(percen, n1+1);


1! = 1 = 1
2! = 2 * 1 = 2
3! = 3 * 2 * 1 = 6
4! = 4 * 3 * 2 * 1 = 24
5! = 5 * 4 * 3 * 2 * 1 = 120
6! = 6 * 5 * 4 * 3 * 2 * 1 = 720

N = 2


60% 

60/100 
(1/2)^3 = 1/8


	for(n1=0; n1<times; n1++){
		for(n2=0; n2<times; n2++){
			
		}

	}
*/
	return 0;
}