Cod sursa(job #978504)

Utilizator stefanfStefan Fulger stefanf Data 28 iulie 2013 22:42:57
Problema Patrate2 Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 1.56 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, 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);
    }
}

void number(int n) {
    memset(C, 0, NMAX * sizeof(int));
    int i = 1;
    while (n > 0) {
       C[i] = n % 10;
       n /= 10;
       i++;
    }

    C[0] = i - 1;
}

void fact(int n) {
    B[0] = 1;
    B[1] = 1;
    int i = 2;
    while(i <= n) {
        number(i);
        i++;
        mul(B, C);
    }
}

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);
    fact(n);
    mul(A, B);

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

    return 0;
}