/*
 * YOUR INFO HERE!
 */

// FINAL VERSION:

// req: size of mem >= CEIL[top/2]*8
int smallest_multiple(int top, int *mem){
    int *factors = mem;
    int factor_count = 0;
    int n,m,o,r=2;
    factors[factor_count++] = 2;
    for (int i = 3; i <= top; ++i){
        n = i;
        for (int j = 0; j < factor_count && n > 1; ++j){
            m = factors[j];
            o = n / m;
            if (o*m == n){
                n = o;
            }
        }
        if (n > 1){
            factors[factor_count++] = n;
            r *= n;
        }
    }
    return r;
}

#ifdef EULER_PROBLEM
// BUILDING AREA:
struct Euler_In{};

struct Euler_Result{
    int smallest_multiple;
};

static const int TOP = 20;

inline Euler_Result euler_main(Euler_In in){
    int f[TOP];
    
    Euler_Result result;
    result.smallest_multiple = smallest_multiple(TOP, f);
    return result;
}

void euler_print(Euler_Result answer, Euler_In in){
    printf("%d\n", answer.smallest_multiple);
}

#define EULER_CHECK

bool euler_check(Euler_Result answer, Euler_In in){
    bool result;

    bool not_found = 1;
    int x = TOP - 1;
    while (not_found){
        ++x;
        not_found = 0;
        for (int y = 2; y <= TOP; ++y){
            if (x % y != 0){
                not_found = 1;
                break;
            }
        }
    }
    
    printf("answer = %d\n", x);
    result = (answer.smallest_multiple == x);
    
    return result;
}

#endif


