👤

Directorul unei şcoli doreşte să premieze la sfârşitul anului şcolar pe cei mai buni elevi la învăţătură. Pentru acest lucru el are de rezolvat două probleme:
1. Să determine câţi elevi vor fi premiaţi dintre cei n elevi ai şcolii. După discuţii aprinse cu ceilalţi profesori se hotărăşte în Consiliul Profesoral ca numărul premianţilor să fie n - k, unde k este cel mai mare număr pătrat perfect mai mic strict decât n. De exemplu, pentru n=150, k este 144 (pentru că 144 = 122), deci vor fi premiaţi 150 - 144=6 elevi.
2. Pentru a fi cât mai multă linişte la premiere, în Consiliul Profesoral se ia decizia ca elevii care nu vor fi premiaţi să fie aşezaţi pe terenul de sport pe rânduri de câte p elevi (unde p2 = k). În acest scop, directorul a numerotat elevii nepremiaţi de la 1 la k şi a hotărât ca elevii să fie aşezaţi în ordinea descrescătoare a numerelor asociate.


Răspuns :

#include <iostream>

#include <fstream>

#include <cmath>

using namespace std;

ifstream f("lascoala.in");

ofstream g("lascoala.out");

int n, k, i, j, p, prem;

int main()

{

   f >> n;

   k=n-1;

   while (sqrt(k)!=sqrt(k)) --k;

   prem=n-k;

   g << prem << "\n";

   n=n-prem;

   p=sqrt(k);

   for (i=1; i<=p; ++i)

   {

       for (j=1; j<=p; ++j)

           {g << n << " "; --n;}

       g << "\n";

   }

}