• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JavaScript SPOJ Zadanie Fibonacci Sum

0 głosów
585 wizyt
pytanie zadane 14 lutego 2020 w SPOJ przez Colossus Mądrala (6,850 p.)

Mam problem z zadaniem "Fibonacci Sum" na SPOju. https://www.spoj.com/problems/FIBOSUM/
Przepisałem kod z C++ na JavaScript, ale tylko kod z C++ przechodzi to zadanie.
Nie wiem dlaczego, wydaje mi się że dobrze przepisałem.
Tu jest kod z JS:

MOD = 1000000007;

function mul(a, b)
{
    res = [[0,0],[0,0]];
    for(var i = 0 ; i < 2 ; i ++)
        for(var j = 0 ; j < 2 ; j++)
            for(var k = 0 ; k < 2 ; k++)
                res[i][j] = (res[i][j] + a[i][k]*b[k][j]) % MOD;
    for(i = 0 ; i < 2 ; i++)
        for(j = 0 ; j < 2 ; j++)
            a[i][j] = res[i][j];
}
function power(n)
{
    fib = [[1 , 1], [ 1 , 0]],temp = [[1 , 0 ] , [0 , 1]];
    while(n)
    {
        if(n&1)
            mul(temp , fib);
        mul(fib , fib);
        n>>=1;
    }
    return temp[0][1];
}

var t = parseInt(readline());
while(t--)
{
    [l, r] = readline().split(' ');
    l = parseInt(l);
    r = parseInt(r);
    print((power(r+2) - power(l+1) + MOD)%MOD);
}

A tu z C++ na którym się wzorowałem:

#include <bits/stdc++.h>
using namespace std;
#define MOD 1000000007
#define ULL unsigned long long 
void mul(ULL a[][2] , ULL b[][2])
{
    ULL res[2][2];
    memset(res , 0 , sizeof res);
    for(int i = 0 ; i < 2 ; i ++)
        for(int j = 0 ; j < 2 ; j++)
            for(int k = 0 ; k < 2 ; k++)
                res[i][j] = (res[i][j] + a[i][k]*b[k][j]) % MOD;
    for(int i = 0 ; i < 2 ; i++)
        for(int j = 0 ; j < 2 ; j++)
            a[i][j] = res[i][j];
}
ULL  power( ULL  n)
{
    ULL  fib[2][2] = { {1 , 1} , { 1 , 0}},temp[2][2] = { {1 , 0 } , { 0 , 1}};
    while(n)
    {
        if(n&1)
            mul(temp , fib);
        mul(fib , fib);
        n>>=1;
    }
    return temp[0][1];
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ULL l , r;
        cin>>l>>r;
        cout<<(power(r+2) - power(l+1) + MOD)%MOD<<endl;
    }
    return 0;
}


Może ktoś widzi w czym jest problem z kodem w JavaScripcie?

1 odpowiedź

0 głosów
odpowiedź 14 lutego 2020 przez DawidK Nałogowiec (37,890 p.)

Przyznam szczerze, ze ciezko mi sie to analizuje przy takiej ilosci petli i jedno literowych zmiennych (zwlaszcza C++), rozwiazalbym to zadanie jednak troche inaczej. Jezeli dobrze rozumiem funkcja ma obliczac modulo 1000000007 z sumy ciagu fibonacciego miedzy dwoma podanymi wartosciami (wlacznie) . Ponizszy kod nie jest kompletny - spoj z tego co kojarze wymaga jeszcze inputow ( readline() ). Pierwsza funkcja oblicza rekurencyjnie ciag fibonacciego, druga sume w przedziale.

        const mod = 1000000007;

        function fib(n){
            if (n==0) {
                return 0
            }
            if (n==1) {
                return 1
            } else {
                return fib(n-1) + fib(n-2)
            }
        }

        function sum(from,to){
            result = 0
            do {
                result += fib(from)
                from+=1
            } while (from<=to)
            return result
        }

        const final_result = sum(2,7)%mod

Nie wiem czy to przejdzie korzystam z codewars

komentarz 14 lutego 2020 przez Colossus Mądrala (6,850 p.)
Niestety, ale rozwiązania liniowe nie przechodzą tego zadania.

Musi być złożoność O(log n)

Podobne pytania

0 głosów
1 odpowiedź 597 wizyt
pytanie zadane 8 września 2019 w SPOJ przez cupoforanges Początkujący (380 p.)
0 głosów
2 odpowiedzi 3,691 wizyt
pytanie zadane 22 grudnia 2018 w JavaScript przez Weronika Nowicjusz (220 p.)
+2 głosów
3 odpowiedzi 5,565 wizyt
pytanie zadane 11 stycznia 2018 w JavaScript przez rayet5 Nowicjusz (200 p.)

93,776 zapytań

142,736 odpowiedzi

323,388 komentarzy

63,381 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...