Algoritmul, pas cu pas
- Casele vizitate sunt exact numerele de forma , adică numerele cu multiplu de .
- Casa e vizitată .
- Ca să fie vizitate toate casele, trebuie să dividă fiecare . Cel mai mare astfel de divizor comun e .
- Îl acumulez cu algoritmul lui Euclid: pornesc cu (cmmdc cu dă celălalt număr) și fac .
Complexitate: .
Soluția în C++
#include <fstream>
using namespace std;
ifstream fin("posta.in");
ofstream fout("posta.out");
long long cmmdc(long long a, long long b) {
while (b) { long long r = a % b; a = b; b = r; }
return a;
}
int main() {
int n;
fin >> n;
long long g = 0, a;
for (int i = 0; i < n; i++) {
fin >> a;
g = cmmdc(g, a - 1); // x trebuie să dividă a-1 pentru fiecare casă
}
fout << g << "\n";
return 0;
}Greșeli frecvente
- Folosești
intpentru numerele caselor — ajunge la , decilong longobligatoriu. - Uiți că x divide , nu — progresia pornește de la , nu de la ; diferența față de contează.
- Inițializezi cmmdc cu în loc de — cmmdc se ia peste diferențe; pornește cu și combină câte un .