Cod sursa(job #790767)

Utilizator geniucosOncescu Costin geniucos Data 22 septembrie 2012 12:02:14
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<cstdio>
using namespace std;
int mod,n;
struct str
{
    long long a[3][3];
};
str ori(str a,str b)
{
    str rez;
    long long s,i,j,k;
    for(i=1;i<=2;i++)
        for(j=1;j<=2;j++)
        {
            s=0;
            for(k=1;k<=2;k++)
                s=s+a.a[i][k]*b.a[k][j];
            rez.a[i][j]=s%mod;
        }
    return rez;
}
str pow(str a,int n)
{
    str c,rez;
    if(n==1) return a;
    if(n%2==0)
    {
        c=pow(a,n/2);
        rez=ori(c,c);
    }
    else
    {
        c=pow(a,n-1);
        rez=ori(c,a);
    }
    return rez;
}
str mat,rez;
int main()
{
freopen("kfib.in","r",stdin);
freopen("kfib.out","w",stdout);
scanf("%d",&n);
mod=666013;
mat.a[1][1]=0;
mat.a[1][2]=1;
mat.a[2][1]=1;
mat.a[2][2]=1;
rez=pow(mat,n-2);
//rez=ori(mat,mat);
printf("%d\n",(rez.a[1][2]+rez.a[2][2])%mod);
return 0;
}