Cod sursa(job #1356143)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 23 februarie 2015 11:10:57
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include <stdio.h>
long long t[4][4],a1[4][4],v[4][4],arr[4],arr2[4];
long long a,b,c,x,y,z,n;
void inm()
{
    for(int i=1;i<=2;i++)
     {
             for(int j=1;j<=2;j++)
             {
                     t[i][j]=0;
                     for(int k=1;k<=2;k++)
                     {
                             t[i][j]+=(int)v[i][k]*v[k][j]%666013;
                     }
             }
     }
     for(int i=1;i<=3;i++)
     {
             for(int j=1;j<=3;j++) v[i][j]=t[i][j];
     }
}
int rid(int putere)
{
     if(putere!=1)
     {
                  rid(putere/2);
                  inm();
                  if(putere%2==1)
                  {
                                 for(int i=1;i<=2;i++)
                                 {
                                         for(int j=1;j<=2;j++)
                                         {
                                                 t[i][j]=0;
                                                 for(int k=1;k<=2;k++)
                                                 {
                                                         t[i][j]+=(int)v[i][k]*a1[k][j]%666013;
                                                 }
                                         }
                                 }
                                 for(int i=1;i<=2;i++)
                                 {
                                         for(int j=1;j<=2;j++) v[i][j]=t[i][j];
                                 }
                  }
     }
}
int main()
{
    freopen ("kfib.in","r",stdin);
    freopen ("kfib.out","w",stdout);
    int k;
            scanf("%d",&k);
            a1[1][1]=0;
            a1[2][1]=1;
            a1[1][2]=1;
            a1[2][2]=1;
            for(int i=1;i<=2;i++)
            {
                    for(int j=1;j<=2;j++)
                    {
                            v[i][j]=a1[i][j];
                    }
            }
            arr[1]=0;
            arr[2]=1;
            rid(k-1);
            for(int i=1;i<=2;i++)
            {
                    for(int j=1;j<=2;j++)
                    {
                            arr2[i]+=arr[j]*t[j][i];
                            arr2[i]%=666013;
                    }
            }
            printf("%d\n",arr2[2]);
}