Într-o zi frumoasă de vara, Gigel la auzit pe fratele mai mare spunând că ştie să scrie numărul 600
ca sumă de numere consecutive în 5
moduri distincte. Deoarece Gigel este ambiţios, doreşte să poată să facă şi el astfel de afirmaţii. Mai exact, el îşi doreşte să poată să spună care este cel mai mic număr natural care poate fi descompus ca sumă de două sau mai multe numere naturale consecutive în exact N
moduri şi care sunt acele moduri.
Cerința
Să se determine cel mai mic număr natural care respectă condițiile lui Gigel.
Date de intrare
Fișierul de intrare consecutive.in
conține pe prima linie numărul N
, reprezentând numărul de moduri în care numărul găsit de Gigel să poată fi scris ca suma de numere consecutive
Date de ieșire
Fișierul de ieșire consecutive.out
va conține pe prima linie numărul x
, reprezentând numărul găsit de Gigel, iar pe următoarele N
linii va fi afișat câte un număr, reprezentând lungimea secvenţei.
Restricții și precizări
1 ≤ n ≤ 100
- Se garantează că soluţia e mai mică decât
1.000.000
Exemplu
consecutive.in
2
consecutive.out
9 2 3
Explicație
9 = 4 + 5
(secventa de lungime 2
care incepe de la 4
)
9 = 2 + 3 + 4
(secventa de lungime 3
care incepe de la 2
)
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema nconsecutive:
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
int countWays(int n) {
int ret = 0;
int N = n * 2;
for (int m = 2; m * m <= 2 * n; m++) {
if (m % 2 == 0) {
// n/m + 1/2 integer
if ((N + m) % (m * 2) == 0) {
ret++;
}
} else {
// n / m integer
if (n % m == 0) {
ret++;
}
}
}
return ret;
}
vector<int> getWays(int n) {
vector<int> ret;
int N = n * 2;
for (int m = 2; m * m <= 2 * n; m++) {
if (m % 2 == 0) {
// n/m + 1/2 integer
if ((N + m) % (m * 2) == 0) {
ret.push_back(m);
}
} else {
// n / m integer
if (n % m == 0) {
ret.push_back(m);
}
}
}
return ret;
}
pair<int, vector<int> > solve(int n) {
const int amax = int(1e6);
for (int i = 1; i <= amax; i++) {
int num = countWays(i);
if (num == n) {
return make_pair(i, getWays(i));
}
}
return make_pair(-1, vector<int>());
}
int main() {
ifstream cin("consecutive.in");
ofstream cout("consecutive.out");
int n;
cin >> n;
pair<int, vector<int> > ans = solve(n);
cout << ans.first << "\n";
for (int& x : ans.second) {
cout << x << "\n";
}
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1833 nconsecutive
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1833 nconsecutive de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!