Rezolvare completă PbInfo #1833 nconsecutive

Într-­o zi frumoasă de vara, Gigel l­a 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 Adresa de email.

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!