
function Formula(id,m)
    {
	this.n=0;
	this.m=m;
	this.v=1;
	this.id=id;
	this.Blocks = new Array(arguments.length-2);
	for(iBlock=0;iBlock<arguments.length-2;iBlock++)
	{
		this.Blocks[iBlock] = arguments[iBlock+2];
		this.n += 1;
	}
	this.addBlock = function()
	{
		this.Blocks.push(arguments[0]);
		this.n += 1;
	}
	
	this.sortN =function()
    {
        return arguments[1] - arguments[0]
    }
	
	this.MaxK = function()
	{
		var arrK = new Array(this.Blocks.length);
		for(var bc = 0; bc<this.Blocks.length; bc++)
		{
			arrK[bc]=parseFloat(this.Blocks[bc].blockK());
		}
		arrK.sort(this.sortN);
		var mk=1.0;
		for (var tt=0; tt<(this.n-this.m);tt++)
		{
		    mk *= arrK[tt];
		}
		return mk;
	}
	
	
	this.formulaK = function()
	{
		this.v=1;
		var coef = 1.0;
		
		var rows = this.n-this.m;
		var cols = this.n;
		var M = this.m;
		
		var arrF = new Array(rows);
		for(i=0;i<rows;i++)
		{
			arrF[i] = new Array(cols);
		}
				
		// --- Init Array
		for(iR=0;iR<rows;iR++)
		{
			for(iC=0;iC<cols;iC++)
			{
				arrF[iR][iC]=0.0;
			}
		}		
				
		for (iRow = 0; iRow < rows; iRow++)
		{
			for (iCol=iRow;iCol<iRow+M+1;iCol++)
			{
				var bk=this.Blocks[iCol].blockK();
				arrF[iRow][iCol]=bk;
			}
		}
		var Prev=0.0;
		var Curr=0.0;
		for (i=cols-1;i>=0;i--)
		{
			Curr = arrF[rows-1][i];
			Curr = Prev+Curr;
			arrF[rows-1][i]=Curr;
			Prev=Curr;
		}
		
		if (rows - 1 != 0)
            {                
                Prev = 0.0; var DR=0.0;
                for (iRow = rows - 2; iRow >= 0; iRow--)
                {
                    for (iCol = cols - 2; iCol >= 0; iCol--)
                    {
                        Curr = arrF[iRow][iCol];
                        DR = arrF[iRow + 1][iCol + 1];
                        Prev = arrF[iRow][iCol + 1];

                        Curr = DR*Curr;
                        Curr = Prev+Curr;
                        arrF[iRow][iCol]=Curr;
                    }
                }
                coef = Curr;
            }
            else coef = Curr;
            var VVV = parseInt(Binomial(this.n,this.m));
            this.v = VVV;
            return coef;
	    }
    }
