Cod sursa(job #978492)

Utilizator stefanfStefan Fulger stefanf Data 28 iulie 2013 22:09:28
Problema Patrate2 Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define NMAX 100000

int A[NMAX], B[NMAX], C[NMAX];

void add(int *a, int *b) {
    int i, t = 0;
    for (i = 1; i <= a[0] || i <= b[0] || t; i++, t /= 10) {
        a[i] = (t += a[i] + b[i]) % 10;
    }

    a[0] = i - 1;
}

void mul(int *a, int *b) {
    int i, j, t = 0, C[NMAX];
    memset(C, 0, sizeof(C));
    for (i = 1; i <= a[0]; i++) {
        for (t = 0, j = 1; j <= b[0] || t; j++, t /= 10) {
            C[i+j-1] = (t += C[i+j-1] + a[i] * b[j]) % 10;
        }
        if (i + j - 2 > C[0])
            C[0] = i + j - 2;
    }
    memcpy(a, C, sizeof(C));
}

void logExp(int *a, int n) {
    if (n == 0) {
        a[0] = 1;
        a[1] = 1;
        return;
    }

    if (n == 1)
        return;

    int t[NMAX];
    memcpy(t, a, sizeof(int) * NMAX);
    a[0] = 1;
    a[1] = 1;
    
    while (1) {
        if (n % 2)
            mul(a, t);
        n /= 2;
        if (n == 0)
            break;

        mul(t,t);
    }
}

int main() {
    freopen("patrate2.in", "r", stdin);
    freopen("patrate2.out", "w", stdout);

    int i, n;
    scanf("%d", &n);

    A[0] = 1;
    A[1] = 2;

    logExp(A, n * n + 1);

    for (i = A[0]; i > 0; i--)
        printf("%d", A[i]);

    return 0;
}