Cod sursa(job #1412535)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 1 aprilie 2015 12:41:39
Problema Plus Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <cstdio>

using namespace std;


struct elem
{
    long long v;
    long long hm;
};

long long solve(elem a, long long s)
{
    if (a.v == 0 && s != 0)
        return 0;
    else if (a.v == 0 && s == 0)
        return a.hm+1;
    else
    {
        long long nr = s/a.v;
        if (nr <= a.hm)
            return 1;
        else
            return 0;
    }
}

long long solve(elem a, elem b, long long s)
{
    if (a.v == 0)
        return (a.hm+1) * solve(b, s);
    if (b.v == 0)
        return (b.hm+1) * solve(a, s);
    if (a.v == -1 && b.v == 1)
        return solve(b, a, s);
    if (a.v == 1 && b.v == -1)
        return min(a.hm-s, b.hm)+1;
    if (a.v == 1 && b.v == 1)
        return min(max(a.hm, s), b.hm-(s-a.hm)) + 1;
    elem x = a; x.v = -a.v;
    elem y = b; y.v = -b.v;
    if (s > 0) return 0;
    if (s == 0) return 1;
    return solve(x, y, -s);
}

long long solve(elem a, elem b, elem c, long long s)
{
    long long rez = 0;
    if (a.v == 0)
        return (a.hm+1) * solve(b, c, s);
    if (b.v == 0)
        return (b.hm+1) * solve(a, c, s);
    if (c.v == 0)
        return (c.hm+1) * solve(a, b, s);
    if (a.hm > 0)
        for (int i = 0; i <= a.hm; i++)
            rez += solve(b, c, s-i*(a.v));
    return rez;
}


int main()
{
    freopen("plus.in", "r", stdin);
    freopen("plus.out", "w", stdout);

    elem a, b, c;
    long long s, rez;

    scanf("%lld", &s);
    scanf("%lld %lld", &a.hm, &a.v);
    scanf("%lld %lld", &b.hm, &b.v);
    scanf("%lld %lld", &c.hm, &c.v);

    rez = solve(a, b, c, s);
    printf("%lld", rez);

    return 0;
}