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ść
mateczek
» 2017-10-28 21:22:18
wiem, że niektóre sprawdzarki są tak zrobione, że cout<< nie przechodzi i trzeba użyć print () szczególe jeśli zadanie pochodzi z mainedu czy innego takiego oficjalnego
P-166159
jankowalski25
» 2017-10-28 21:26:08
Czasami wystarczy dołożyć
std::ios::sync_with_stdio( false );
P-166161
jatoprzechuj
Temat założony przez niniejszego użytkownika
» 2017-10-28 22:28:28
Mam już dołożone std::ios::sync... Ta sprawdzarka przy innych zadaniach normalnie działała z coutem.
P-166162
mateczek
» 2017-10-28 22:59:05
no to albo dasz link do zadania i może ktoś luknie o co tam chodzi albo "wróżbita maciej"
P-166163
garlonicon
» 2017-10-28 23:00:49
Oprócz tego, co wymieniłem wcześniej, to jeszcze można zauważyć, że wartości modulo się powtarzają, więc dla małych
m
 da się to jeszcze przyspieszyć biorąc pod uwagę długość okresu - czytaj: Pisano period. W takim przypadku jeśli na przykład
m == 2
, to reszty tworzą ciąg:
{ 0, 1, 1, 0, 1, 1, 0, 1, 1,...}
, czyli wystarczy wiedzieć, że jego długość wynosi 3 i obliczyć wartość dla
n % 3
 zamiast dla
n
.
P-166164
jatoprzechuj
Temat założony przez niniejszego użytkownika
» 2017-10-29 11:53:02
Nie mogę dać linka bo to jest zamknięta platforma, tresc zadania jest w pierwszym poście lecz są jeszcze limity: | Time: 1 s | Memory: 2 MB |
P-166182
mateczek
» 2017-10-30 08:21:07
spróbuj użyć funkcji "C" jeśli i to nie pomoże to pokombinuj z optymalizacją i wykorzystaniem okresowości jak radził garlonicon.  Aczkolwiek jeśli "n" ma mieć max 100 to pętla do stu nie powinna być jakoś specjalnie zasobożerna
C/C++
#include <iostream>
using namespace std;
int main() {
    int t, n, m;
    scanf( "%d", & t );
    while( t-- ) {
        scanf( "%d %d", & n, & m );
        int an_1 = 1, an_2 = 1, an = 1; //an wyliczany wyraz ciągu; an_1 poprzedni wyraz ciągu; an_2-wyraz ciągu drugi od końca
        for( int i = 3; i <= n; i++ ) {
            an =( an_2 + an_1 ) % m;
            an_2 = an_1;
            an_1 = an;
        }
        printf( "%d\n", an );
    }
    return 0;
}
P-166236
garlonicon
» 2017-10-30 13:02:58
A jeśli to nadal nie wystarczy, to napisz odpowiedni szablon (wtedy obliczenia nastąpią w czasie kompilacji), a później tylko wypisz wynik. Możesz zacząć od czegoś takiego:
C/C++
#include <iostream>

template < unsigned int n >
struct fibonacci
{
    enum { value = fibonacci < n - 1 >::value + fibonacci < n - 2 >::value };
};

template <>
struct fibonacci < 0 >
{
    enum { value = 0 };
};

template <>
struct fibonacci < 1 >
{
    enum { value = 1 };
};

int main()
{
    std::cout << fibonacci < 5 >::value;
}
Oczywiście to jest tylko najprostsza wersja pokazująca, o co chodzi. Aby to zadziałało w praktyce, trzeba nieco inaczej to zapisać tak, aby wywołanie
fibonacci < 100 >::value
 miało jakiś sens. Trzeba również uwzględnić resztę z dzielenia (wewnątrz szablonu, może coś w stylu
fibonacci < n, m >::value
, gdzie
n
 i
m
 będą zawsze stałymi czasu kompilacji).
P-166237
1 2 « 3 » 4 5 6 7
Poprzednia strona Strona 3 z 7 Następna strona