1 / 6
Feb 2017
  1. Jest taki sposób na szybkie obliczanie n-tej liczby ciągu Fibonacciego poprzez mnożenie macierzy .

  2. Czy w zadaniu http://pl.spoj.com/problems/AL_20_05/11 - "Gra w klasy" - można też zastosować sposób z mnożeniem macierzy ?

  • created

    Feb '17
  • last reply

    Feb '17
  • 5

    replies

  • 718

    views

  • 3

    users

  • 1

    like

  • 3

    links

Oto dlaczego :

  1. Moje rozwiązanie ma czas 0.09 sek - a najlepsze mają czas 0.01 sek .

  2. Zastanawiam się czy to wina złego algorytmu ( nieoptymalnego ) czy to tak zwane Fast I/O zadziałało w innych rozwiązaniach.

  3. Zupełnie nie rozumiem na jakiej zasadzie działa mnożenie macierzy że daje n-ty wyraz ciągu Fibonacciego . Może teraz gdybym wiedział jakich macierzy użyć ( o jakiej ilości wierszy i kolumn ) to zrozumiał bym zasadę działania tej "sztuczki".

Dokładniej poprzez szybkie potęgowanie macierzy.

Jeżeli można, to też ciekawy jestem jak to zrobić...., bo może zasugerowałeś się pkt 1, a tutaj przecież to nie jest ciąg fibonacciego.

A dokładniej 0.00 sek

Dokładnie tak + szybszy język [c, c++] i poprawny algorytm.

AD 3
Jeżeli nie rozumiesz, jak mnożeniem [dokładniej szybkim potęgowaniem] można uzyskać n-ty wyraz ciągu Fibonacciego, to nie byłoby Ci raczej łatwiej zrozumieć zasadę działania tego algorytmu na tym przypadku [gdyby było można?]. Bo jeżeli możnaby użyć tu tej metody, macierz kwadratowa. wydaje mi się, że musiałaby mieć rozmiar co najmnie 3x3, ale nie umiem jej zbudować-wymyślić [więc może jeszcze większy rozmiar?]. Lub może nie jest to możliwe?

Wydaje mi się, że trochę lepszym wektorem początkowym będzie: [1,1,0], ale oczywiście wygląda, że działa, i tak, i tak.
Ja doszedłem do macierzy:

1 1 0
1 0 1
1 0 0

czyli takiej transponowanej ale coś mi tam nie zadziałało i sobie odpuściłem.
Poza tym, o ile przy macierzy dla ciągu fibonacciego, rozumiem w miarę dokładnie jak to zostało wyprowadzone, to tu na czuja.
Skrypt oczywiście znam i gdzieś tam mam na kąpie, ale trzeba do niego znowu zajrzeć i sobie odświerzyć co nieco.