Zagadka Nicolo Tartaglii - zadanie.
Witam. Program który napisałem sprawdzałem "ręcznie" na kilku przykładach i wszystko się zgadzało, lecz w programie sprawdzającym otrzymałem wynik 2/3 (2 odpowiedzi poprawne, 1 niepoprawna).
W opisie błędu widniała taka informacja: "wczytano 'NIE', a oczekiwano '565773'". Szukałem przyczyny tego błędu w kodzie, lecz nic nie znalazłem. Stąd moje pytanie: Czy widzicie jakiś błąd w moim programie ?Treść zadania:
W XVI wieku dwóch utalentowanych matematyków – Gerolamo Cardano i Nicolo Tartaglia – prowadziło
spór o to, kto pierwszy z nich nauczył się rozwiązywać równania trzeciego stopnia (takie jak x
3 + 3x =
14). Chociaż prawdopodobnie rację miał Tartaglia, w publicznym sporze jednak zwyciężył Cardano, którego
nazwiskiem nazwano odpowiednie wzory. Pewne znaczenie miał tu fakt, że Tartaglia przegrał (modny w owych
czasach) pojedynek na zadania matematyczne, który prowadził z uczniem Cardana, Lodovico Ferrarim. W tym
pojedynku – jak sądzimy – obaj zadawali sobie nawzajem równania do rozwiązania, lecz Ferrari opanował tę
sztukę znacznie sprawniej, a ponadto umiał rozwiązywać nawet trudniejsze równania, czwartego stopnia.
Jak Ty sprawiłbyś się w pojedynku z Tartaglią? Jego zagadki – ze względu na niechęć do używania w owych
czasach liczb ujemnych – sformułowane są następująco:
Mając dane liczby naturalne p i q, znajdź taką liczbę naturalną x, dla której
x
3 + px = q
lub ustal, że taka liczba nie istnieje.
Wejście
W pierwszym wierszu wejścia znajduje się liczba zagadek z, nie większa niż 10 000. W kolejnych wierszach
podane są zagadki, z których każda to dwie liczby naturalne p i q. Obie liczby są dodatnie, liczba p nie przekracza
1012, zaś q – 1018. Liczby są oddzielone pojedynczym odstępem, każda zagadka podana jest w osobnym
wierszu.
Wyjście
Wypisz odpowiedzi na wszystkie zagadki, w tej kolejności, w jakiej były podane na wejściu. Odpowiedź powinna
być liczbą naturalną spełniającą podane równanie. Jeśli taka liczba nie istnieje, zamiast liczby wypisz słowo
NIE.
Kod Programu:
#include <iostream>
#include <math.h>
using namespace std;
long long rownanie( long long x, long long p )
{
long long wyn;
wyn = pow( x, 3 ) + x * p;
return wyn;
}
long long stopien3( long long p, long long q )
{
long long xMAX = pow( q,( 1 / 3.0 ) );
if( rownanie( xMAX, p ) == q ) return xMAX;
long long xMIN = 1;
bool brak = false;
while( xMAX > xMIN )
{
long long srodek =( xMAX + xMIN + 1 ) / 2;
if( rownanie( srodek, p ) <= q ) xMIN = srodek;
else xMAX = srodek - 1;
}
if( rownanie( xMAX, p ) == q ) return xMAX;
else return brak;
}
int main()
{
int z;
cin >> z;
long long p[ z - 1 ], q[ z - 1 ];
for( int i = 0; i < z; ++i )
cin >> p[ i ] >> q[ i ];
for( int i = 0; i < z; ++i )
{
long long wyn = stopien3( p[ i ], q[ i ] );
if( wyn == 0 ) cout << "NIE" << endl;
else cout << wyn << endl;
}
}