/*
Online Java - IDE, Code Editor, Compiler
Online Java is a quick and easy tool that helps you to build, compile, test your programs
online.
*/

import java.math.*;
import java.util.*;

class largestNumber
{
    long combinations;
    int count;
    String temp;
    Set <String> s = new HashSet <>();
    List <Integer> lst = new ArrayList<>(Arrays.asList(10,7,76,415));
    future, it will be chosen to use other data
    List <Integer> copy = new ArrayList<>(lst);
    
    public largestNumber(long combinations)
    {
        this.combinations=combinations;
        int randomNumber;
        int numberArray;
        Random rand = new Random();
        System.out.println("Combinations: " + combinations +"\n");
        
        do
        {
            lst = new ArrayList<>(copy);
            temp="";
            
            do
            {
                System.out.println("Size of list: " + lst.size());
                randomNumber = rand.nextInt(lst.size()); 
                System.out.println("random number: " + (randomNumber));
                numberArray = lst.get(randomNumber);
                System.out.println("This is number in list: " + numberArray);
                temp = temp + Integer.toString(numberArray);
                lst.remove(randomNumber);
            } while (!lst.isEmpty());
            
            s.add(temp);
            System.out.println("set size: " + s.size() +"\n");
            count++;
        } while (s.size()<combinations);
        
        System.out.println("Number cycles: " + count);
        System.out.println("Original list: " + copy.toString());
        System.out.println("highest is: " + checkMaximum());
    }

    public int checkMaximum()
    {
        int highest=0;
        
        for (String m: s)
        {
            if (Integer.valueOf(m)>highest)
            {
                highest=Integer.valueOf(m);
            }
        }
        return highest;
    }
}

public class Combination
{
    public static void main(String[] args) 
    {
        System.out.println("Welcome to Online IDE!! Happy Coding :)");
        int originalNumber=4;
        int n=originalNumber;
        int r =4;
        Map <Integer, Long> m = new HashMap<>();
        System.out.println("***COMBINATIONS*** (WITHOUT REPLACEMENT)");
        System.out.println("C(n,r) = n! / (r!(n−r)!)");
        System.out.println("C(" + n+","+r+") = " + n+"!" + " / " + "("+r+"!"+"("+n+"-"+r+")!)");
        largestNumber ln = new largestNumber(Combinations (n,r,originalNumber, m));
    }
    
    public static long Combinations (int n, int r, int originalNumber, Map factorialResults)
    {
        long result=0;
        int denominator1;
        int denominator2;
        
        if (n>=1)
        {
            result = (n* (Combinations (n-1, r,originalNumber, factorialResults)));

            factorialResults.put(n,result);
            
            if (n==originalNumber)
            {
                denominator1 = originalNumber-r;
                denominator2 = r;
                
                if (factorialResults.containsKey(denominator1) && factorialResults.containsKey(denominator2))
                {
                    factorialResults.get(denominator1));
                    factorialResults.get(denominator2));
                    
                    return result / ((long) factorialResults.get(denominator1) * (long)factorialResults.get(denominator2));
                }
            }
            return result;
        }
        return 1;
    }
}