Cod sursa(job #1452459)

Utilizator stoianmihailStoian Mihail stoianmihail Data 20 iunie 2015 22:33:35
Problema Light2 Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>

#define Nadejde 22
#define NIL     -1
#define ll long long

int K;   /// k
ll int N;
ll int answer;   /// raspunsul cautat
ll int lBulb[Nadejde];   /// vectorul cu di

inline ll gcd(ll int X, ll int Y) {
    ll int r;
    while (Y) {
        r = X % Y;
        X = Y;
        Y = r;
    }
    return X;
}

inline ll int lcm(ll int X, ll int Y) {
    return (X * Y / gcd(X, Y));
}

void phi(ll int pos, ll int e, ll int lo, ll int hi) {
    ll int i;   /// un index
    ll int T;   /// noul termen
    for (i = pos + 1; i < K; i++) {
        T = lcm(e, lBulb[i]);   /// cmmmc(e, di)
        answer += N / T * lo * hi;   /// adunam raspunsul
        phi(i, T, -lo, hi << 1LL);   /// apelam recursiv functia
    }
}

int main(void) {
    FILE *f;
    ll int i;

    f = fopen("light2.in", "r");

    fscanf(f, "%d %d", &N, &K);
    for (i = 0; i < K; i++) {
        fscanf(f, "%lld", &lBulb[i]);
    }
    fclose(f);

    for (i = 0; i < K; i++) {
        answer += (N / lBulb[i]);
        phi(i, lBulb[i], NIL, (1 << -NIL));   /// pentru fiecare di apelam o functie recursiva
    }

    f = fopen("light2.out", "w");
    fprintf(f, "%lld\n", answer);   /// afisam rezultatul dorit
    fclose(f);

    printf("Doamne ajuta!");   /// Multumim Doamne!
    return 0;
}