Cod sursa(job #1483668)

Utilizator vladrochianVlad Rochian vladrochian Data 9 septembrie 2015 18:40:31
Problema Invers Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
#include <cstring>
using namespace std;

const int kMaxL = 10005;

ifstream fin("invers.in");
ofstream fout("invers.out");

bool Solve(const char *nr, int l, int r) {
  if (l > r)
    return false;

  char aux[kMaxL];
  for (int i = 1; i <= r; ++i)
    aux[i] = nr[i] - '0';

  while (l < r) {
    if (aux[l - 1] > 1)
      return false;

    if (aux[l - 1] == 1)
      aux[l] += 10;

    if (aux[l] >= aux[r] + 10) {
      --aux[r - 1];
      for (int i = r - 1; aux[i] == -1; --aux[--i])
        aux[i] = 9;
      aux[r] += 10;
    }

    if (aux[l] < aux[r])
      return false;
    aux[l] -= aux[r];

    ++l;
    --r;
  }

  if (l == r)
    return aux[l] % 2 == 0 && aux[l - 1] < 2;

  return aux[r] == 0;
}

int main() {
  int T;
  char nr[kMaxL];
  fin >> T;
  while (T--) {
    fin >> (nr + 1);
    int len = strlen(nr + 1);
    if (Solve(nr, 1, len) || Solve(nr, 2, len))
      fout << "DA\n";
    else
      fout << "NU\n";
  }
  return 0;
}