Cod sursa(job #899252)

Utilizator eduard.hogeaedi hogea eduard.hogea Data 28 februarie 2013 13:35:40
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<cstdio>
#define m 666013
using namespace std;
long long z[3][3],mi[3][3],a[3][3];
int k;
void matp(int k)
{ for (;k;k>>=1)
    {if ( k&1 ) //sol= (sol * a) % m;
        {mi[1][1]=((a[1][1]*z[1][1])%m+ (a[1][2]*z[2][1])%m)%m;
         mi[1][2]=((a[1][1]*z[1][2])%m+ (a[1][2]*z[2][2])%m)%m;
         mi[2][1]=((a[2][1]*z[1][1])%m+ (a[2][2]*z[2][1])%m)%m;
         mi[2][2]=((a[2][1]*z[1][2])%m+ (a[2][2]*z[2][2])%m)%m;
         a[1][1]=mi[1][1]; a[2][1]=mi[2][1]; a[1][2]=mi[1][2]; a[2][2]=mi[2][2];
        }
     mi[1][1]=((z[1][1]*z[1][1])%m + (z[1][2]*z[2][1])%m)%m;
     mi[1][2]=((z[1][1]*z[1][2])%m + (z[1][2]*z[2][2])%m)%m;
     mi[2][1]=((z[2][1]*z[1][1])%m + (z[2][2]*z[2][1])%m)%m;
     mi[2][2]=((z[2][1]*z[1][2])%m + (z[2][2]*z[2][2])%m)%m;
    // a=(a * a) % m;
     z[1][1]=mi[1][1]; z[2][1]=mi[2][1]; z[1][2]=mi[1][2]; z[2][2]=mi[2][2];
    }
}
int main()
{freopen("kfib.in","rt",stdin);
 freopen("kfib.out","wt",stdout);
 scanf("%d",&k);
 z[1][2]=z[2][1]=z[2][2]=1;
 a[1][2]=a[2][1]=a[2][2]=1;
 matp(k-2);
 printf("%lld\n",a[2][2]);
 return 0;
}