Rezolvare completă PbInfo #1092 Spatrat

Cerința

Să se scrie un număr natural n ca sumă de pătrate perfecte. De asemenea, numărul termenilor trebuie să fie minim.

Date de intrare

Fișierul de intrare spatrat.in conține un număr natural n, numărul care se cere să fie scris ca suma de patrate perfecte.

Date de ieșire

Fișierul de ieșire spatrat.out va conține pe prima linie un număr k, reprezentând numărul termenilor din adunare. Pe a doua linie se vor scrie cele k numere care ridicate la pătrat și adunate dau n, separate printr-un spațiu.

Restricții și precizări

  • 1 ≤ n ≤ 100.000
  • pentru 40% dintre teste, n ≤ 1000
  • punctajul pe un test complet se acordă astfel: max(5 - (k_program - k_corect), 0) (unde k_corect este răspunsul corect, iar k_program răspunsul dat de sursa trimisă)
  • pentru afișarea doar a valorii lui k se va acorda doar 50% din punctajul calculat după formula de mai sus pentru fiecare test
  • lăcomia nu se răsplătește cu punctajul maxim!

Exemplu

spatrat.in

18

spatrat.out

2
3 3

Explicație

3 2 + 3 2 = 9 + 9 = 18
18 nu este pătrat perfect, deci nu se poate scrie ca sumă formată din el însuși (ca să existe soluție pentru k = 1)

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 Spatrat:

#include <fstream>
#include <cmath>
using namespace std;

ifstream fin("spatrat.in");
ofstream fout ("spatrat.out");

const int N = 1e5 + 5, oo = 1e9;

int d[N], t[N], n;

int main() {
    fin >> n;
    for (int i = 1; i <= n; ++i)
        d[i] = t[i] = oo;
    for (int j = sqrt(n); j; --j) {
        for (int i = 0; i <= n - j * j; ++i)
            if (d[i] != oo && d[i + j * j] > d[i] + 1) {
                d[i + j * j] = d[i] + 1;
                t[i + j * j] = j;
            }
    }
    fout << d[n] << "\n";
    while (t[n]) {
        fout << t[n] << " ";
        n -= t[n] * t[n];
    }
}

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 #1092 Spatrat

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1092 Spatrat 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!