Mai intai trebuie sa te autentifici.

Cod sursa(job #3134920)

Utilizator popescustefanita09@yahoo.comPopescu Alberto Stefanita [email protected] Data 31 mai 2023 20:57:12
Problema Al k-lea termen Fibonacci Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <stdio.h>
#include <stdlib.h>
long long **inmultire(long long **A,long long **B)
{
    long long **C = (long long **)malloc(2 * sizeof(long long *));
    for (int i = 0; i < 2; i++) 
    {
        C[i] = (long long *)malloc(2 * sizeof(long long));
    }
    C[0][0]=(A[0][0]*B[0][0]%666013 + A[0][1]*B[1][0]%666013)%666013;
    C[0][1]=(A[0][0]*B[0][1]%666013 + A[0][1]*B[1][1]%666013)%666013;
    C[1][0]=(A[1][0]*B[0][0]%666013 + A[1][1]*B[1][0]%666013)%666013;
    C[1][1]=(A[1][0]*B[0][1]%666013 + A[1][1]*B[1][1]%666013)%666013;
    return C;
}
long long **exp_log_rec(long long **Z, long long n)
{
    long long **C = (long long **)malloc(2 * sizeof(int *));
    for (int i = 0; i < 2; i++) 
    {
        C[i] = (long long *)malloc(2 * sizeof(long long));
    }
    if(n<0) return NULL;
    if(n == 0)
    {
        C[0][0]=1;
        C[0][1]=0;
        C[1][0]=0;
        C[1][1]=1;
        return C;
    }
    C=exp_log_rec(inmultire(Z,Z),n/2);
    if(n % 2 == 0) return C;
    if(n % 2 == 1) return inmultire(Z ,C);
    return NULL;
}
int main(void)
{
    FILE *f=NULL,*g=NULL;
    int n,x;
    long long **Z=NULL,**C=NULL;
    Z=(long long**)(malloc(2*sizeof(long long*)));
    //M=(long long**)(malloc(sizeof(long long*)));
    for (int i = 0; i < 2; i++) 
    {
        Z[i] = (long long *)malloc(2 * sizeof(long long));
        //M[i]=(long long*)malloc(2*sizeof(long long));
    }
    Z[0][0]=0;
    Z[0][1]=1;
    Z[1][0]=1;
    Z[1][1]=1;
    if((f=fopen("kfib.in","r"))==NULL)
    {
        perror(NULL);
        exit(-1);
    }
    if((g=fopen("kfib.out","w"))==NULL)
    {
        perror(NULL);
        exit(-1);
    }
    fscanf(f,"%d",&n);
    if(fclose(f)!=0)
    {
        perror(NULL);
        exit(-1);
    }
    C=exp_log_rec(Z,n-1);
    /*for(int i=0;i<=1;i++)
    {
        for(int j=0;j<=1;j++)
            printf("%d ",C[i][j]);
        printf("\n");
    }
    printf("%lld %lld\n",M[0][0],M[0][1]);*/
    fprintf(g,"%lld",C[1][1]);
    if(fclose(g)!=0)
    {
        perror(NULL);
        exit(-1);
    }
    free(Z);
    free(C);
    return 0;
}