Cod sursa(job #1850827)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 18 ianuarie 2017 22:40:26
Problema Nunta Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f("nunta.in");
ofstream g("nunta.out");

const int SIZE = 200;
int a[2][2], n, sol[2][2];
int a1[SIZE], a2[SIZE];
int fin[2][2], in[2][2];

void inmm(int k, int a[]) {
    int i, t = 0;
    int b[SIZE] = {0};
    for (i = 1; i <= a[0] || t; i++) {
        t += a[i]*k;
        b[i] = t%10;
        t /= 10;
    }
    b[0] = i-1;
    memcpy(a, b, sizeof(b));
}

void adun(int a[], int b[]) {
    int i, t = 0;
    int c[SIZE] = {0};
    for (i = 1; i <= max(a[0], b[0]) || t; i++) {
        t += a[i]+b[i];
        c[i] = t%10;
        t /= 10;
    }
    c[0] = i-1;
    memcpy(a, c, sizeof(c));
}

void inm(int a[2][2], int b[2][2]) {
    int c[2][2], i, j, k;
    for (i = 0; i < 2; i++)
        for (j = 0; j < 2; j++) {
            c[i][j] = 0;
            for (k = 0; k < 2; k++)
                c[i][j] += a[i][k]*b[k][j];
        }
    for (i = 0; i < 2; i++)
        for (j = 0; j < 2; j++)
            a[i][j] = c[i][j];

}

int main() {
    f >> n;
    if (n < 3) { g << n; return 0;}

    a[0][1] = a[1][0] = a[1][1] = 1;
    sol[0][0] = sol[1][1] = 1;
    a1[0] = a1[1] = 1;
    a2[0] = 1, a2[1] = 2;
    n--;
    while (n) {
        if (n%2)
            inm(sol, a);
        inm(a, a);
        n/=2;
    }
    inmm(sol[0][0], a1);
    inmm(sol[0][1], a2);
    adun(a1, a2);
    for (int i = a1[0]; i >= 1; i--)
        g << a1[i];

    return 0;
}