Cod sursa(job #1794707)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 1 noiembrie 2016 17:36:01
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>

#define MOD 666013

FILE *in, *out;

struct matrice
{
    long long a, b, c, d;
};

matrice inmult(matrice x, matrice y)
{
    matrice z;
    z.a = ((x.a * y.a) % MOD + (x.b * y.c) % MOD) % MOD;
    z.b = ((x.a * y.b) % MOD + (x.b * y.d) % MOD) % MOD;
    z.c = ((x.c * y.a) % MOD + (x.d * y.c) % MOD) % MOD;
    z.d = ((x.c * y.b) % MOD + (x.d * y.d) % MOD) % MOD;

    return z;
}

matrice expmat(matrice x, int n)
{
    if(n == 1) {
        return x;
    }
    matrice y = expmat(x, n / 2);
    //printf("XXXX %d %d %d %d YYYY  %d %d %d %d NNN %d\n", x.a, x.b, x.c, x.d, y.a, y.b, y.c, y.d, n);
    if(n & 1) {
        return inmult(inmult(y, y), x);
    } else {
        return inmult(y, y);
    }
}

int main ()
{

  in = fopen("kfib.in", "r");
  out = fopen("kfib.out", "w");

  int f;

  fscanf(in, "%d", &f);
  //printf("%d", f);

  matrice baz;
  baz.a = 0;
  baz.b = 1;
  baz.c = 1;
  baz.d = 1;


  baz = expmat(baz, f - 2);

  fprintf(out, "%lld", (baz.b + baz.d) % MOD);

  fclose(in);
  fclose(out);

  return 0;
}