Cod sursa(job #1533127)

Utilizator ASTELOTudor Enescu ASTELO Data 22 noiembrie 2015 09:21:30
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<cstdio>
long long c[3][3],a[3][3],b[3][3],i,j,n,k;
void mult(int n)
    {
    if(n==0)
        return ;
    int i,j,k;
    if(n%2==1)
        {
        for(i=1;i<=2;i++)
            for(j=1;j<=2;j++)
                {
                for(k=1;k<=2;k++)
                    {
                    c[i][j]+=a[i][k]*b[k][j];
                    c[i][j]%=666013;
                    }
                }
        for(i=1;i<=2;i++)
            for(j=1;j<=2;j++)
                {
                b[i][j]=c[i][j];
                c[i][j]=0;
                }
        mult(n-1);
        }
    else
        {
        for(i=1;i<=2;i++)
            for(j=1;j<=2;j++)
                {
                for(k=1;k<=2;k++)
                    {
                    c[i][j]+=a[i][k]*a[k][j];
                    c[i][j]%=666013;
                    }
                }
        for(i=1;i<=2;i++)
            for(j=1;j<=2;j++)
                {
                a[i][j]=c[i][j];
                c[i][j]=0;
                }
        mult(n/2);
        }
    }
int main ()
{
freopen("kfib.in","r",stdin);
freopen("kfib.out","w",stdout);
a[1][1]=0;
a[1][2]=1;
a[2][1]=1;
a[2][2]=1;
for(i=1;i<=2;i++)
    for(j=1;j<=2;j++)
        b[i][j]=a[i][j];
scanf("%lld",&n);
mult(n-3);
printf("%lld",(b[2][1]+b[2][2])%666013);
return 0;
}