Kod: AC
Link do zadania: https://pl.spoj.com/problems/AL_13_03/23
created
last reply
- 9
replies
- 501
views
- 3
users
- 2
likes
- 1
link
Kod: AC
Link do zadania: https://pl.spoj.com/problems/AL_13_03/23
Przykładowe wejście:
1000000000
Jako ciekawostka, funkcjonalność kompilatora clang pozwalająca na identyfikację błędów takich jak w załączonym programie:
$ clang++ -g -fsanitize=integer a.cpp
$ 1000000000 | ./a.out
a.cpp:11:65: runtime error: unsigned integer overflow: 17490168 - 722019349 cannot be represented in type 'unsigned long long'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior a.cpp:11:65 in
761306912
(Informacja o “undefined-behavior” jest niestety technicznie niepoprawna w tym przypadku).
Jedna droga do poprawy wyniku to takie przeformułowanie zależności aby uzyskać tylko jedno wywołanie rekurencyjne i uniknąć w ten sposób konieczności zapamiętywania wyników obliczeń.
Pomysł zasadniczo opera się na obliczaniu wartości dwóch kolejnych elementów ciągu Fibonacciego równocześnie, czego można dokonać wyrażając Fib(2n) i Fib(2n+1) przy pomocy Fib(n) i Fib(n+1).
Może poniższy szkic funkcji skuteczniej przekaże idea rozwiązania. Docelowo f(k//2)
to jedyne wywołanie rekurencyjne:
def f(k):
"""f(k) = fib(k), fib(k+1)"""
if k == 0:
return 0, 1
a, b = f(k // 2)
if k % 2 == 0:
# k = 2n
# a = fib(n)
# b = fib(n+1)
# return fib(2n), fib(2n+1)
else:
# k = 2n+1
# a = fib(n)
# b = fib(n+1)
# return fib(2n+1), fib(2n+2)
Topic | Category | Replies | Views | Activity |
---|---|---|---|---|
MBPROB01 - History version in plaintext pl.spoj.com | Zbiór zadań | 6 | 174 | Jul '24 |
FR_20_02 - Poszukiwacze skarbów - Błąd w testach? | Zbiór zadań | 1 | 95 | Apr 2 |
PP0504B - StringMerge - w języku C | Zbiór zadań | 5 | 205 | Jun '24 |
TFRACAL - Kalkulator ułamków | Zbiór zadań | 2 | 142 | Feb 1 |
TOPSORTL - Porządek leksykograficzny w grafie | Zbiór zadań | 3 | 145 | Jul '24 |