După o zi plină, trei băieți se joacă cu numere. În fiecare seară, unul dintre ei alege un număr x
, iar altul un număr y
mai mare sau egal cu x
. Al treilea propune ceva mai interesant. Astfel, el alege să le spună aproape instantaneu suma pătratelor perfecte de la x
și y
. Voi trebuie să rezolvați ceva asemănător, doar că știți numai ce zice primul și ultimul băiat. Pentru a-i verifica dacă greșesc la calcule, în schimb, trebuie să găsiți numărul pe care l-ar putea spune al doilea.
Formal, pentru două numere x
și y
se definește SPP(x,y) = x
2
+ (x+1)
2
+...+ y
2
(suma pătratelor perfecte de la x
la y
).
Se dau Q
întrebări de tipul x p
și se cere cel mai mic y
mai mare sau egal ca x
pentru care SPP(x,y) ≥ p
2
.
Cerința
Să se calculeze pentru fiecare întrebare p
minimum, pentru care relația este satisfăcută.
Date de intrare
Fișierul de intrare spp.in
conține pe prima linie un număr natural Q
. Pe liniile 2
, 3
, …, Q+1
se află câte o pereche x p
care satisface restricțiile.
Date de ieșire
Fișierul de ieșire spp.out
va conține răspunsul la fiecare întrebare.
Restricții și precizări
Q ≤ 100.000
1 ≤ x ≤ 100.000
1 ≤ p ≤ 1.000.000.000
- Pentru 30% din teste,
Q ≤ 100
saup ≤ 1000
Exemplu
spp.in
2 1 5 10 19
spp.out
4 12
Explicație
1
2
+ 2
2
+ 3
2
+ 4
2
= 30 ≥ 5
2
.
10
2
+ 11
2
+ 12
2
= 365 ≥ 19
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 spp:
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("spp.in");
ofstream g("spp.out");
int q, x, p;
int binarys(int x, int st, int dr, long long pp)
{
int sol = 0;
long long px = (1LL * x * (x + 1) * (2 * x + 1)) / 6;
while (st <= dr) {
int mid = (st + dr) >> 1;
long long py = (1LL * mid * (mid + 1) * (2 * mid + 1)) / 6;
if (py - px >= pp)
sol = mid, dr = mid - 1;
else
st = mid + 1;
}
return sol;
}
int main()
{
int i;
f >> q;
for (i = 1; i <= q; i++) {
f >> x >> p;
int y = binarys(x - 1, x, x + 1500000, 1LL * p * p);
g << y << '\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 #3401 spp
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3401 spp 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!