Cod sursa(job #2242446)

Utilizator Robert_VRVRobert Vadastreanu Robert_VRV Data 18 septembrie 2018 18:12:51
Problema Prod Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

const int MAX_CIF = 5000;

void mul(int A[], int B[]) {
  int t = 0, C[1 + MAX_CIF];
  memset(C, 0, sizeof(C));
  C[0] = A[0] + B[0] - 1;
  for (int i = 1; i <= A[0]; i++)
    for (int j = 1; j <= B[0]; j++)
      C[i + j - 1] += A[i] * B[j];
  for (int i = 0; i <= C[0]; i++) {
    t = (C[i] += t) / 10;
    C[i] %= 10;
  }
  if (t > 0)
    C[++C[0]] = t;
  memcpy(A, C, sizeof(C));
}
bool bigger(int A[], int B[]) {
  if (A[0] < B[0]) {
    return false;
  } else if (A[0] > B[0]) {
    return true;
  } else {
    for (int i = 1; i <= A[0]; i++) {
      if (A[i] < B[i])
        return false;
      else if (A[i] > B[i])
        return true;
    }
  }
  return true;
}

void print(int A[]) {
  for (int i = A[0]; i > 0; i--)
    printf("%d", A[i]);
  printf("\n");
}

int main() {

  freopen("prod.in", "r", stdin);
  freopen("prod.out", "w", stdout);

  int freq[10];
  for (int i = 1; i <= 9; i++)
    scanf("%d", &freq[i]);
  int a[1 + MAX_CIF], b[1 + MAX_CIF];
  a[0] = 0; b[0] = 0;
  for (int i = 9; i > 0; i--)
    for (int j = 1; j <= freq[i]; j++) {
      if (bigger(a, b))
        b[++b[0]] = i;
      else
        a[++a[0]] = i;
    }
  std::reverse(a + 1, a + a[0] + 1);
  std::reverse(b + 1, b + b[0] + 1);
  mul(a, b);
  print(a);

  fclose(stdin);
  fclose(stdout);

  return 0;
}