Cod sursa(job #1200075)

Utilizator hrazvanHarsan Razvan hrazvan Data 21 iunie 2014 20:20:59
Problema Patrate2 Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#define MAXCIF 100000

void inmult(int *v1, int *dr1, int *v2, int *dr2){
  int i, j, v3[ MAXCIF ];
  for(i = 0; i < MAXCIF; i++) v3[i] = 0;
  for(i = 0; i < *dr2; i++){
    for(j = 0; j < *dr1; j++){
      v3[j + i] += v1[j] * v2[i];
    }
  }
  j = 0;
  while(v3[j] > 9 || j < (*dr1)){
    if(v3[j] > 9 && j + 2 > *dr1) *dr1 = j + 2;
    v3[j + 1] += v3[j] / 10;
    v1[j] = v3[j] % 10;
    j++;
  }
  v1[j] = v3[j];
  return ;
}

void fctrl(int n, int *v, int *dr){
  int ci, i, v2[3], dr2;
  for(i = 2; i <= n; i++){
    ci = i;
    dr2 = 0;
    while(ci > 0){
      v2[dr2] = ci % 10;
      ci /= 10;
      dr2++;
    }
    inmult(v, dr, v2, &dr2);
  }
  return ;
}

void expn2(int n, int *v, int *dr){
  int v2[ MAXCIF ], dr2, cdr2;
  v2[0] = 2;
  dr2 = 1;
  while(n > 0){
    if(n & 1){
      inmult(v, dr, v2, &dr2);
    }
    cdr2 = dr2;
    inmult(v2, &dr2, v2, &cdr2);
    n /= 2;
  }
  return ;
}

int main(){
  FILE *in = fopen("patrate2.in", "r");
  int n;
  fscanf(in, "%d", &n);
  fclose(in);
  FILE *out = fopen("patrate2.out", "w");
  int v[MAXCIF], dr = 1, i;
  v[0] = 1;
  fctrl(n, v, &dr);
  expn2(n * n, v, &dr);
  for(i = dr - 1; i >= 0; i--){
    fprintf(out, "%d", v[i]);
  }
  fclose(out);
  return 0;
}