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));
    List <Integer> copy = new ArrayList<>(lst);

    public largestNumber(long combinations)
    {
        this.combinations=combinations;
        int randomNumber;
        int numberArray;
        int counter=0;
        Random rand = new Random();
        System.out.println("Combinations: " + combinations +"\n");
        
        do
        {
            temp="";
            counter=0;
            
            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);
                counter++;
                
            } while (counter<lst.size());
                
                
            s.add(temp);
            System.out.println("This will be stored in set: " + 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()
    {
        System.out.println("IN CLASS");
        int highest=0;
        
        for (String m: s)
        {
            if (Integer.parseInt(m)>highest)
            {
                highest=Integer.valueOf(m);
            }
            return highest;
        }
        return 0;
    }
}

public class Combination
{
    public static void main(String[] args) 
    {
        System.out.println("Welcome to Online IDE!! Happy Coding :)");
        int originalNumber=5;
        int n=originalNumber;
        int r =6;
        Map <Integer, Long> m = new HashMap<>();
        System.out.println("***COMBINATIONS*** (WITH REPLACEMENT)");
        System.out.println("C^R(" + n+","+r+") = " + "(n+r-1)! / r!(n-1)!");
        System.out.println("C^R(" + n+","+r+") = " + (n+r-1)+ "!" + " / " + r+"!"+"("+(n-1)+")!");
        System.out.println(Combinations (n,r,originalNumber, m));
        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;
        int Numerator=n+r-1;
        
        if (Numerator>=1)
        {
            result = ((n+r-1)* (Combinations (n-1, r,originalNumber, factorialResults)));
            factorialResults.put(Numerator,result);
            factorialResults.get(n+r-1);
                
            if (n==originalNumber)
            {
                denominator1 = r;
                denominator2 = originalNumber-1;
                    
                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;
    }
}
