Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wyznaczanie modulo z ciągu fibonacciego

Ostatnio zmodyfikowano 2017-11-07 19:00
Autor Wiadomość
pekfos
» 2017-10-30 13:24:20
Pewnie wystarczy tylko trochę rozwinąć pętlę, żeby nie robić modulo przy każdym obrocie. Dzielenie i modulo całkowitoliczbowe są bardzo wolne.
P-166238
garlonicon
» 2017-10-30 13:28:40
Przecież zamiast modulo wystarczy odejmowanie (które będzie wykonane co najwyżej raz, bo jeśli mamy dwie liczby mniejsze od
m
, to ich suma zawsze będzie mniejsza, niż
2 * m
).

Dorzucę jeszcze wskazówkę dla tych, którzy zechcieliby użyć szablonów:
C/C++
template < unsigned int first, unsigned int second, unsigned int current, unsigned int index, unsigned int modulo >
struct fib_iter
{
    enum { value =( current == index ) ?(( second > modulo ) ?( second - modulo )
            :( second ) )
            : fib_iter <(( second > modulo ) ?( second - modulo )
            :( second ) ),(( first + second > modulo ) ?( first + second - modulo )
            :( first + second ) ),( current + 1 ), index, modulo >::value };
};
Oczywiście wyniki produkowane przez to cudo powyżej trzeba pozbierać do jakiegoś tablicopodobnego tworu nie przekraczając przy tym limitu kompilatora (który w przypadku GCC wynosi 900, ale można go zmienić używając flagi
-ftemplate-depth=NOWY_LIMIT
).
P-166239
jatoprzechuj
Temat założony przez niniejszego użytkownika
» 2017-10-31 18:25:33
Dzięki za to info o szablonach. Dowiedziałem, się że zadziała to używając macierzy. Wiem mniej więcej na czym polegają, ale nie bardzo umiem ich użyć w cpp. Z góry dziękuję za każdą pomoc.
P-166292
jankowalski25
» 2017-10-31 18:32:02
Najprościej chyba potraktować macierz jako tablicę dwuwymiarową - czytaj: » Kurs C++Tablice zmiennych lekcja.
P-166293
jatoprzechuj
Temat założony przez niniejszego użytkownika
» 2017-10-31 19:59:07
Zaimplementować to jako dwie takie tablice? tab[2][2] = {1,1}, {1,0} Bo właśnie nie jestem pewny co do tych liczb co wpisałem w środku tablic.
P-166296
jankowalski25
» 2017-11-01 18:24:29
Prędzej chodzi o tablicę w stylu
int tab[ MAX_N ][ MAX_M ] = { /*tutaj wstaw wyniki*/ };
, a użycie to po prostu
std::cout << tab[ n ][ m ]
. W tym przypadku maksymalną wartością byłoby 109. Zgaduję, że szablony miały służyć do tego, aby takiej tablicy nie wypełniać ręcznie. Można to jeszcze zoptymalizować w oparciu o cykliczność, jak wspomniał garlonicon.
P-166337
mateczek
» 2017-11-01 20:19:40
w treści zadania jest że modulo ma być max 109 max a to nie problem nawet tego okresu nie trzeba liczyć tylko wstawić tą tabelę do kodu copy-pastle i powstawiać przecinki
choć moim zdaniem pętla kręcoca się maksymalnie do 109 powinna dać radę w sekundę (limit czasowy) się wyrobić !!!
C/C++
#include<iostream>
using namespace std;
int main( void )
{
    int tab[] = { 1, 1, 3, 8, 6, 20, 24, 16, 12, 24, 60, 10, 24, 28, 48, 40, 24, 36, 24, 18, 60, 16, 30, 48, 24,
        100, 84, 72, 48, 14, 120, 30, 48, 40, 36, 80, 24, 76, 18, 56, 60, 40, 48, 88, 30, 120, 48, 32, 24,
        112, 300, 72, 84, 108, 72, 20, 48, 72, 42, 58, 120, 60, 30, 48, 96, 140, 120, 136, 36, 48, 240, 70, 24,
        148, 228, 200, 18, 80, 168, 78, 120, 216, 120, 168, 48, 180, 264, 56, 60, 44, 120, 112, 48, 120, 96, 180,
        48, 196, 336, 120, 300, 50, 72, 208, 84, 80, 108, 72, 72, 108, 60, 152 };
    int t, n, m;
    scanf( "%d", & t );
    while( t-- ) {
        scanf( "%d %d", & n, & m );
        int wynik;
        if( m <= 1 ) {
            wynik = 0; // reszta z dzielenia przez jeden jest zawsze zero
        } else {
            int okres = n % tab[ m ];
            if( okres == 0 ) wynik = 0; //zerowy element ciągu
            else if( okres <= 2 ) wynik = 1; //dwa pierwsze elementy ciągu
            else { //jeśli trzeba policzyć element ciągu większy równy trzy
                int an_1 = 1, an_2 = 1;
                for( int i = 3; i <= okres; i++ ) {
                    wynik =( an_2 + an_1 );
                    if( wynik > m ) wynik -= m; // zamiast modulo
                   
                    an_2 = an_1;
                    an_1 = wynik;
                }
            }
        }
        printf( "%d\n", wynik );
    }
    return 0;
}
P-166346
Monika90
» 2017-11-02 08:17:13
To pewnie miało być 109.
P-166347
1 2 3 « 4 » 5 6 7
Poprzednia strona Strona 4 z 7 Następna strona