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

JavaScript SPOJ Zadanie Fibonacci Sum

Object Storage Arubacloud
0 głosów
355 wizyt
pytanie zadane 14 lutego 2020 w SPOJ przez Colossus Mądrala (6,410 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,910 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,410 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ź 426 wizyt
pytanie zadane 8 września 2019 w SPOJ przez cupoforanges Początkujący (380 p.)
0 głosów
2 odpowiedzi 2,543 wizyt
pytanie zadane 22 grudnia 2018 w JavaScript przez Weronika Nowicjusz (220 p.)
+2 głosów
3 odpowiedzi 4,967 wizyt
pytanie zadane 11 stycznia 2018 w JavaScript przez rayet5 Nowicjusz (200 p.)

92,535 zapytań

141,376 odpowiedzi

319,449 komentarzy

61,920 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...