Algoritmul, pas cu pas
Cheia: broscuța cu intervalul cântă fix în secundele care nu depășesc , adică de ori. Pentru că poate ajunge la și timpul e doar secunde, nu parcurgem secundele una câte una, ci folosim formule.
Cerința 1 — maximul individual. Răspunsul este .
Cerința 3 — numărul de duete.
- Două broscuțe cu intervalele , cântă simultan exact în multiplii lui , deci de ori.
- Adun aceste valori pentru cele perechi.
- Momentele când cântă toate trei (multiplii lui ) nu sunt duete, dar sunt numărate în fiecare dintre cele perechi. Le scad de ori.
Cerința 2 — primul duet. Cel mai devreme duet al unei perechi e chiar — dar numai dacă acolo nu cântă și a treia broscuță, adică dacă . Răspunsul e cel mai mic astfel de cmmmc de pereche (care nu depășește ).
Toate cerințele se rezolvă în (pentru cmmmc) — independent de .
Soluția în C++
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("oac.in");
ofstream fout("oac.out");
long long cmmdc(long long a, long long b) {
while (b) { long long r = a % b; a = b; b = r; }
return a;
}
long long cmmmc(long long a, long long b) {
return a / cmmdc(a, b) * b; // împărțim întâi ca să nu depășim long long
}
int main() {
int C;
fin >> C;
long long k1, k2, k3, T;
fin >> k1 >> k2 >> k3 >> T;
if (C == 1) {
// multiplii fiecărui interval până la T
fout << max({T / k1, T / k2, T / k3}) << "\n";
} else {
long long L12 = cmmmc(k1, k2);
long long L13 = cmmmc(k1, k3);
long long L23 = cmmmc(k2, k3);
long long L123 = cmmmc(L12, k3); // toate trei deodată
if (C == 3) {
// perechi - de 3 ori momentele cu toate trei (nu sunt duete)
long long duete = T / L12 + T / L13 + T / L23 - 3 * (T / L123);
fout << duete << "\n";
} else { // C == 2
long long pairs[3] = {L12, L13, L23};
long long best = -1;
for (int i = 0; i < 3; i++) {
// un duet apare la cmmmc-ul perechii doar dacă acolo NU cântă a treia
if (pairs[i] < L123 && pairs[i] <= T) {
if (best == -1 || pairs[i] < best) best = pairs[i];
}
}
fout << best << "\n";
}
}
return 0;
}- Parcurgi secundele una câte una — cu până la și secunde limită, o buclă până la depășește timpul. Folosește și cmmmc.
- Numeri momentele cu toate trei ca duete — ele apar în toate perechile, dar enunțul le exclude; scade-le de ori la cerința 3.
- Calculezi cmmmc ca fără să împarți întâi — produsul poate depăși; scrie și folosește
long long.