Cod sursa(job #965764)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 24 iunie 2013 17:18:00
Problema Plus Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <iostream>
#include <fstream>

using namespace std;

long long result;
long long sum, x[4], y[4], S;

int main()
{
    ifstream f ("plus.in");
    f>>S;
    int i;
    long long aux1, aux2, left, right;
    for (i=1; i<=3; i++)
    {
        f>>x[i]>>y[i];
    }
    f.close();

    for (i=0; i<=x[1]; i++)
    {
        sum = S - i*y[1]; /// din S scad i de y[1] si pe sum incerc sa il obtin cu y[2] si y[3]
        if (y[2] == 0 && y[3] == 0) /// daca sunt aman2 0 atunci
        {
            if (sum == 0) /// sum trebuie sa fie si el 0
                result += (x[2] + 1) * (x[3] + 1); /// din fiecare multime de 0 pot sa pun x[2] respectiv x[3] de 0 sau pot sa aleg sa nu pun nimic
            continue;
        }
        if (y[2] != 0 && y[3] == 0)/// daca a 3a e 0
        {
            sum = sum * y[2];/// sum trebuie sa aiba acelasi semn cu a 2a ( 0<= sum) si sum trebuie sa fie <= x[2] ca sa pot forma suma
            if (0 <= sum && sum <= x[2])
                result += (x[3] + 1); /// x[3] + 1 pentru ca pot sa pun x[3] de 0 sau pot sa nu pun nimic
            continue;
        }
        if (y[2] == 0 && y[3] != 0) /// daca a 2a e 0
        {
            sum = sum * y[3]; /// sum trebuie sa aiba acelasi semn cu a 3a ( 0<= sum) si sum trebuie sa fie <= x[3] ca sa pot forma suma
            if (0 <= sum && sum <= x[3])
                result += (x[2] + 1); /// x[2] + 1 pentru ca pot sa pun x[2] de 0 sau pot sa nu pun nimic
            continue;
        }
        if (y[2] != 0 && y[3] != 0) /// daca nu-i niciuna 0
        {
            aux1 = (sum - 0*y[2])*y[3];
            aux2 = (sum - x[2]*y[2])*y[3];
            left = min (aux1, aux2);
            right = max (aux1, aux2);
            left = max (0LL, left);
            right = min (x[3], right);
            /// am intersectat [left, right] cu [0, x[3]], unde
            /// [left, right] este intervalul din care ia valori coeficientul lui y[3]
            /// atunci cand coeficientul lui y[2] ia valori in intervalul [0, x[2]]
            if (left <= right)
                result += (right - left + 1);
        }

    }

    ofstream g("plus.out");
    g<<result<<"\n";
    g.close();

    return 0;
}