3 / 6
Sep 2015

Mam problem z tym zadaniem. Napisałem kod w C, który wydaje się działać poprawnie, ale sędzia twierdzi, że odpowiedź jest błędna. Ktoś ma pojęcie o co może chodzić?

edit: Usuwam kod. Jest AC.

  • created

    Sep '15
  • last reply

    Oct '15
  • 5

    replies

  • 1.7k

    views

  • 4

    users

  • 1

    like

  • 1

    link

Ja symbol Newtona liczyłem całkiem inaczej i zwracając double a nie long longa. Jesteś pewien że masz dobry algo?

Algorytm powinien być dobry. To algorytm wyprowadzony bezpośrednio z postaci iteracyjnej dwumianu i tylko kolejność działań jest tak ułożona, żeby iloczyn cząstkowy był zawsze całkowity.

typ long, typ unsigned long [int] czasami może być typem 64-bitowym a czasami typem 32-bitowym. Kiedy, gdzie i czemu? Zależy to od kompilatora.
Zależy to nie od architektury procesora [trochę też], ale przede wszystkim od systemu operacyjnego. Jeżeli system jest 32-bitowy, to ...... Jeżeli system operacyjny jest 64-bitowy to ...
Dlatego najbezpieczniej jest użyć typu:
long long - on jest typem 64-bitowym na obu sytemach operacyjnych.

PS
Wynik pośredni może przekroczyć, ale wynik końcowy jest <=10^9 < INT_MAX < UINT_MAX < 2^32 < LONG_LONG_MAX ......itd

Dzięki! Zmiana z „long” na „long long” pomogła. Na swoim systemie nie zauważyłem błędu, bo jest 64 bitowy.

21 days later

Hej. Mam problem z zadaniem 833 Dwumiany.
Kod wydaje mi sie, ze jest dobry, wyniki wychodza jak nalezy, a wyskakuje mi bledna odpowiedz.

Ponizej kod:

include

using namespace std;
long long silnia(long long n, long long k)
{
double w;
if (k == 0)
{
return (double) w;
}
else
{
for (int i = 1; i <= k; i++)
{
w = w * (n - i + 1) / i;
}
return (double) w;
}
}
int main()
{
ios_base::sync_with_stdio(false);
long long a,b;
int c;
cin >> c;
long long *tab;
tab = new long long [c];
for (int i = 0; i < c; i++)
{
cin >> a >> b;
if (a == b)
{
tab[i] = 1;
}
else
{
tab[i] = silnia(a, b);
}
}
for (int i = 0; i < c; i++)
{
cout << tab[i] << endl;
}
return 0;
}