Cod sursa(job #1210406)

Utilizator cojocarugabiReality cojocarugabi Data 19 iulie 2014 22:03:20
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fi("kfib.in");
ofstream fo("kfib.out");
long unsigned long z[3][3];
long unsigned long t[3][3];
long unsigned long a[3][3];
int n,p=0;
int putere(int x)
{
    if (x>1)
    {
        putere(x/2);
        //ridic la patrat matricea z
          a[1][1]=z[1][1]*z[1][1]+z[1][2]*z[2][1];
          a[1][2]=z[1][1]*z[1][2]+z[1][2]*z[2][2];
          a[2][1]=z[2][1]*z[1][1]+z[2][2]*z[2][1];
          a[2][2]=z[2][1]*z[1][2]+z[2][2]*z[2][2];
          z[1][1]=a[1][1]%666013;
          z[1][2]=a[1][2]%666013;
          z[2][1]=a[2][1]%666013;
          z[2][2]=a[2][2]%666013;
        //daca ramine rest atunci inmultesc cu matricea constanta
        if (x % 2)
            {
                  a[1][1]=z[1][1]*t[1][1]+z[1][2]*t[2][1];
                  a[1][2]=z[1][1]*t[1][2]+z[1][2]*t[2][2];
                  a[2][1]=z[2][1]*t[1][1]+z[2][2]*t[2][1];
                  a[2][2]=z[2][1]*t[1][2]+z[2][2]*t[2][2];
                  z[1][1]=a[1][1]%666013;
                  z[1][2]=a[1][2]%666013;
                  z[2][1]=a[2][1]%666013;
                  z[2][2]=a[2][2]%666013;
            }
        if (x == n+1)
              {

                  return z[1][1];
              }

    }
}
int main()
{
    z[1][1]=t[1][1]=0;
    z[1][2]=t[1][2]=1;
    z[2][1]=t[2][1]=1;
    z[2][2]=t[2][2]=1;
    fi>>n;
    fo<<putere(n+1)<<"\n";
}