Cod sursa(job #2090820)

Utilizator hrazvanHarsan Razvan hrazvan Data 18 decembrie 2017 19:22:27
Problema Plus Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>

inline int min2(int a, int b){
  return a < b ? a : b;
}

inline int max2(int a, int b){
  return a > b ? a : b;
}

inline long long nrv(int n, int a, int b, int c, int d){
  int aux;
  if(b > d){
    aux = a;  a = c;  c = aux;
    aux = b;  b = d; d = aux;
  }
  if(b == -1){
    if(d == -1){
      if(-n > a + c)
        return 0;
      return max2(0, n + 1 + min2(a, -n) + min2(c, -n));
    }
    else  if(d == 0){
      if(-n > a || n > 0)
        return 0;
      return c + 1;
    }
    else{
      if(n < 0)
        a += n;
      else
        c -= -n;
      return max2(0, min2(a, c) + 1);
    }
  }
  else  if(b == 0){
    if(d == 0)
      return 1LL * (a + 1) * (c + 1) * (n == 0);
    else
      return (a + 1) * (c >= n && n >= 0);
  }
  else{
    if(n > a + c)
      return 0;
    return max2(0, -n + 1 + min2(a, n) + min2(b, n));
  }
}

int main(){
  FILE *in = fopen("plus.in", "r");
  int n, a, b, c, d, e, f, i;
  long long rez = 0;
  fscanf(in, "%d%d%d%d%d%d%d", &n, &a, &b, &c, &d, &e, &f);
  for(i = 0; i <= a; i++)
    rez += nrv(n - i * b, c, d, e, f);
  fclose(in);
  FILE *out = fopen("plus.out", "w");
  fprintf(out, "%lld", rez);
  fclose(out);
  return 0;
}