private void findNumbers(List<long[]> factors, int first, long number, long dist, List<Long> numbers, int iteration) {
        
        if (MAX == dist && NumberUtils.totient(number) == 6227020800L) {
            numbers.add(number);
        }
        
        int i = first;
        
        while(i < factors.size() && factors.get(i)[1] + dist > MAX) { ++i; }
        int j = i;
        long max = getMax(dist);
        while(j < factors.size() && factors.get(j)[1] >= max) { ++j; }
        
        for ( ; i < j; ++i) {
            
            final long[] factor = factors.get(i);
            
            findNumbers(factors, i + 1, number * factor[0], dist + factor[1], numbers, iteration + 1);
        }
    }