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)
(undek_corect
este răspunsul corect, iark_program
răspunsul dat de sursa trimisă) - pentru afișarea doar a valorii lui
k
se va acorda doar50%
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 .
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!