Cod sursa(job #2753992)

Utilizator ptlsebiptl sebi ptlsebi Data 24 mai 2021 20:31:51
Problema Fractii Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

void read_uint32_t(FILE *__restrict stream, uint32_t *__restrict nr) {
    uint8_t ch;
    *nr = 0;
    while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
        *nr *= 10;
        *nr += ch - '0';
    }
    if (ch == '\r') {
        fgetc(stream);
    }
}

uint32_t a[100001];

uint64_t min(uint64_t o1, uint64_t o2) {
    return o1 < o2 ? o1 : o2;
}

uint32_t max(uint32_t o1, uint32_t o2) {
    return o1 > o2 ? o1 : o2;
}

int main() {
    uint32_t q, n, h;
    uint64_t sol;
    {
        FILE *__restrict in = fopen("minlcm.in", "r");
        FILE *__restrict out = fopen("minlcm.out", "w");

        read_uint32_t(in, &q);
        int32_t i, j;
        uint32_t min1, min2;
        uint32_t x, ma = 0;
        sol = UINT64_MAX;
        for (h = 0; h < q; ++h) {
            if (h > 0) {
                memset(a, 0, sizeof(a));
            }
            read_uint32_t(in, &n);
            for (j = 0; j < n; ++j) {
                read_uint32_t(in, &x);
                ma = max(ma, x);
                a[x] = 1;
            }

            for (i = 1; i <= ma; ++i) {
                min1 = min2 = 0;
                for (j = i; j <= ma; j += i) {
                    if (a[j] == 1) {
                        if (min1 == 0) {
                            min1 = j;
                        } else {
                            min2 = j;
                            goto found_both;
                        }
                    }
                }
                found_both:;

                if (min2 != 0) {
                    sol = min(sol, (uint64_t) min1 * (uint64_t) min2 / (uint64_t) i);
                }
            }
            fprintf(out, "%llu\n", sol);
        }

        fclose(in);
        fclose(out);
    }
    return 0;
}