Pentru această operație este nevoie să te autentifici.

Cod sursă (job #304212)

Utilizator avatar Barbumatei Barbu Matei Barbumatei IP ascuns
Problemă 2sah (clasele 11-12) Compilator c | 1,19 kb
Rundă Arhiva de probleme Status evaluat
Dată 23 apr. 2017 18:25:37 Scor 100
#include <stdio.h>
#include <stdlib.h>
#define MOD 100003
#define ULL unsigned long long
ULL a[3][3]={
  { 0, 1, 0 },
  { 0, 0, 1 },
  { 1, 1, 1 }
}, e[3][3]={
  { 1, 0, 0 },
  { 0, 1, 0 },
  { 0, 0, 1 }
}, t[3][1]={ {1}, {1}, {2} }, aux[3][3];

void mult(ULL *c, ULL *d, int n, int m, int p){
  int i, j, k;
  for(i=0; i<n; i++)
    for(j=0; j<p; j++)
      for(k=0; k<m; k++){
        aux[i][j]+=(*(c+i*m+k))*(*(d+k*p+j));
      }
  for(i=0; i<n; i++)
    for(j=0; j<m; j++){
      (*(c+i*m+j))=aux[i][j]%MOD;
      aux[i][j]=0;
    }
}

int main(){
  int k;
  ULL n, p;
  FILE *fin, *fout;
  fin=fopen("2sah.in", "r");
  fout=fopen("2sah.out", "w");
  fscanf(fin, "%llu%llu%d", &p, &n, &k);
  if(p==1){
    k=(k-1)%(MOD-1);
    n=3;
    while(k){
      if(k&1){
        p*=n;
        if(p>MOD)
          p%=MOD;
      }
      n*=n;
      if(n>MOD) n%=MOD;
      k>>=1;
    }
    fprintf(fout, "%llu", p);
    return 0;
  }
  k=n+1-k;
  while(k){
    if(k&1)
      mult(e[0], a[0], 3, 3, 3);
    mult(a[0], a[0], 3, 3, 3);
    k>>=1;
  }
  mult(e[0], t[0], 3, 3, 1);
  fprintf(fout, "%llu", e[0][0]);
  fclose(fin);
  fclose(fout);
    return 0;
}