Cod sursa(job #1138978)

Utilizator x3medima17Dima Savva x3medima17 Data 10 martie 2014 19:23:34
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <vector>
#include <map>
#include <math.h>
#include <fstream>

using namespace std;

ifstream fin("kfib.in");
ofstream fout("kfib.out");
map<int,int> fib;


long long fib2(long q, long long k)
{

    if(q<3) return 1;
    //cout<<q<<" ";
    if(fib[q]) return fib[q];

    char c;
    //cin>>c;
    long n = q/2;
    if(q%2)
    {
        long long l = fib2(n+1,k)%k;
        long long r = fib2(n,k)%k;
        r =  l*l+r*r;
        fib[q] = r%k;
        //cout<<q<<" "<<r<<endl;
        return r%k;
    }
    else
    {
        long long r = fib2(n,k)%k*(fib2(n+1,k)%k+fib2(n-1,k)%k);
        fib[q] = r%k;
        //cout<<q<<" "<<r<<endl;
        return r%k;
    }

}
int main()
{
    fib[0] = 0;
    fib[1] = fib[2] = 1;

    long n = 10000000000;
    long long k = 666013;
    fin>>n;
    //long r1 =fib1(n,k);
    long r2 = fib2(n,k);
//    if(r1!=r2) cout<<"alert";
    fout<<r2;
    //cout<<fib.size();


    return 0;
}