3401 - Spp

From Bitnami MediaWiki

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) = x2 + (x+1)2 +...+ y2 (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) ≥ p2.

Cerința[edit | edit source]

Să se calculeze pentru fiecare întrebare p minimum, pentru care relația este satisfăcută.

Date de intrare[edit | edit source]

Fișierul de intrare input.txt 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[edit | edit source]

Fișierul de ieșire output.txt va conține răspunsul la fiecare întrebare.

Restricții și precizări[edit | edit source]

  • Q ≤ 100.000

Exemplul 1[edit | edit source]

input.txt:

2

1 5

10 19

output.txt:

4

12

Explicație:

1^2 + 2^2 + 3^2 + 4^2 = 30 >= 5^2

10^2 + 11^2 + 12^2 = 365 >= 19^2

Exemplul 2[edit | edit source]

input.txt:

9999999999999

1 5

10 19

Output:

Error: Q is not within the valid range (1 <= Q <= 100,000)

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> import sys

def verify_constraints(Q):

   if not (1 <= Q <= 100000):
       sys.exit("Error: Q is not within the valid range (1 <= Q <= 100,000)")

with open("input.txt", "r") as f, open("output.txt", "w") as g:

   Q = int(f.readline())
   verify_constraints(Q)
   queries = [tuple(map(int, f.readline().split())) for _ in range(Q)]
   for x, p in queries:
       def binarys(x, st, dr, pp):
           sol = 0
           px = (1 * x * (x + 1) * (2 * x + 1)) // 6
           while st <= dr:
               mid = (st + dr) // 2
               py = (1 * mid * (mid + 1) * (2 * mid + 1)) // 6
               if py - px >= pp:
                   sol = mid
                   dr = mid - 1
               else:
                   st = mid + 1
           return sol
       y = binarys(x - 1, x, x + 1500000, 1 * p * p)
       g.write(str(y) + '\n')

</syntaxhighlight>