Pagini recente » Cod sursa (job #2436785) | Cod sursa (job #1831267) | Cod sursa (job #234973) | Cod sursa (job #648279) | Cod sursa (job #1452460)
#include <stdio.h>
#define Nadejde 22
#define NIL -1
#define ll long long
ll int K; /// k
ll int N; /// n
ll int answer; /// raspunsul cautat
ll int lBulb[Nadejde]; /// vectorul cu di
inline ll int 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, "%lld %lld", &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;
}