Pagini recente » Cod sursa (job #1669643) | Cod sursa (job #2283053) | Cod sursa (job #2602764) | Cod sursa (job #1856222) | Cod sursa (job #1452458)
#include <stdio.h>
#define Nadejde 22
#define NIL -1
#define ll long long
int N; /// n
int K; /// k
ll int answer; /// raspunsul cautat
ll int lBulb[Nadejde]; /// vectorul cu di
inline ll gcd(ll int X, ll int Y) {
int r;
while (Y) {
r = X % Y;
X = Y;
Y = r;
}
return X;
}
inline ll int lcm(ll int X, ll int Y) {
return (1LL * 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;
}