Cod sursa(job #1648598)

Utilizator andreib888Balan Andrei andreib888 Data 11 martie 2016 10:56:33
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;

ifstream f("kfib.in");
ofstream g("kfib.out");

void pow(int n, int &a11, int &a12, int &a21, int &a22)
{
    if(n%2==0)
    {
        int b11=a11, b12=a12, b21=a21, b22=a22;
        pow(n/2,b11,b12,b21,b22);
        a11=(b11*b11+b12*b21)%MOD;
        a12=(b11*b12+b12*b22)%MOD;
        a21=(b21*b11+b22*b21)%MOD;
        a22=(b21*b12+b22*b22)%MOD;
    }
    else if(n!=1 && n%2==1)
    {
        int b11=a11, b12=a12, b21=a21, b22=a22;
        int c11, c12, c21, c22;
        pow(n-1,b11,b12,b21,b22);
        c11=(a11*b11+a12*b21)%MOD;
        c12=(a11*b12+a12*b22)%MOD;
        c21=(a21*b11+a22*b21)%MOD;
        c22=(a21*b12+a22*b22)%MOD;
        a11=c11; a12=c12; a21=c21; a22=c22;
    }
}

int main()
{
    int n, a11=0, a12=1, a21=1, a22=1; f>>n;
    if(n==1||n==2) g<<1;
    else
    {
        pow(n-2,a11,a12,a21,a22);
        g<<(a12+a22)%MOD;
    }
    return 0;
}