Cod sursa(job #2784706)

Utilizator Teodor94Teodor Plop Teodor94 Data 17 octombrie 2021 02:15:11
Problema Patrate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>

// a = value, unde value este intreg pe 32 biti
void set(char a[], int& na, int value) {
  int prevna, i;

  prevna = na;
  if (value == 0) {
    a[0] = 0;
    na = 1;
  } else {
    na = 0;
    while (value) {
      a[na++] = value % 10;
      value /= 10;
    }
  }

  for (i = na; i < prevna; ++i)
    a[i] = 0;
}

// a = a * b, unde b este intreg pe 32 biti
void multiply(char a[], int& na, int b) {
  if (b == 0) {
    a[0] = 0;
    na = 1;
  } else {
    int t, i;

    t = i = 0;
    while (i < na || t > 0) {
      t += b * a[i];
      a[i] = t % 10;
      t /= 10;
      ++i;
    }

    if (i > na)
      na = i;
  }
}

// printf(a);
void print(FILE* fout, char a[], int na) {
  int i;

  for (i = na - 1; i >= 0; --i)
    fputc('0' + a[i], fout);
}

#define MAX_DIGITS 5000
#define POW 8

char ans[MAX_DIGITS];
int noAns;

int main() {
  FILE *fin, *fout;
  fin = fopen("patrate2.in", "r");
  fout = fopen("patrate2.out", "w");

  int n, i;
  fscanf(fin, "%d", &n);

  set(ans, noAns, 1);
  for (i = 2; i <= n; ++i)
    multiply(ans, noAns, i);
  for (i = 1; i <= n * n / POW; ++i)
    multiply(ans, noAns, 1 << POW);
  for (i = 1; i <= n * n % POW; ++i)
    multiply(ans, noAns, 2);

  print(fout, ans, noAns);

  fclose(fin);
  fclose(fout);
  return 0;
}