Cod sursa(job #119821)

Utilizator cupacatenumaratecupacatenumarate cupacatenumarate Data 3 ianuarie 2008 14:08:08
Problema Plus Scor 65
Compilator c Status done
Runda Arhiva de probleme Marime 4.72 kb
#include <stdio.h>
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

#define C1 6000001
#define C2 14000001

int A[3], X[3], S;

void read()
{
        int i;
        freopen("plus.in", "r", stdin);
        scanf("%d", &S);
        for (i = 0; i < 3; i++) scanf("%d%d", X+i, A+i);
}

void n3()
{
        int i, j, k;
        long long n3sol=0;

        for (i = 0; i <= X[0]; i++)
            for (j = 0; j <= X[1]; j++)
                for (k = 0; k <= X[2]; k++)
                    if ((i*A[0]+j*A[1]+k*A[2])==S)
                       n3sol++;

        printf("%lld\n", n3sol);
}

void n2()
{
        int i, j, s;
        long long n2sol = 0;

        for (i = 0; i <= X[0]; i++)
            for (j = 0; j <= X[1]; j++)
            {
                s = i*A[0]+j*A[1];
                if (s==S)
                {
                   if (!A[2]) n2sol += X[2];
                   n2sol++;
                }
                if (s<S)
                {
                   if ((S-s)<=X[2])
                   if (A[2]>0) n2sol++;
                }
                if (s>S)
                {
                   if ((s-S)<=X[2])
                   if (A[2]<0) n2sol++;
                }
            }
        printf("%lld\n", n2sol);
}

void n()
{
        int i, j, t, munu = 0, min, max;
        long long nsol = 0;

        for (i = 0; i < 3; i++) munu += (A[i]<0);

        if (munu==3)
        {
           if (!S) printf("1\n");
           else printf("0\n");
           return;
        }

        for (i = 0; i < 3; i++)
            for (j = i+1; j < 3; j++)
                if (A[i]<A[j])
                {
                        munu = A[i]; A[i] = A[j]; A[j] = munu;
                        munu = X[i]; X[i] = X[j]; X[j] = munu;
                }

        if (!A[0])
        {
           if (S==0)
              for (i = 0, nsol = 1; i < 3; i++)
                  if (!A[i]) nsol = nsol*(X[i]+1);
           printf("%lld\n", nsol);
           return;
        }

        for (i = 0; i <= X[0]; i++)
        {
                if ((!A[1])&&(!A[2]))
                {
                   if (S==i) nsol = nsol+(X[1]+1)*(X[2]+1);
                   continue;
                }
                if ((A[1]>0)&&(!A[2]))
                {
                        if (i==S) nsol = nsol+X[2]+1;
                        if ((i+X[1]>=S)&&(i<S)) nsol = nsol+X[2]+1;
                        continue;
                }
                if ((A[1]+A[2])==2)
                {
                        if (i>S) continue;
                        min = MIN(X[1],X[2]);
                        max = MAX(X[1],X[2]);
                        t = S-i;
                        if (t<=min) nsol = nsol+t+1;
                        else
                            if ((min<t)&&(t<=max)) nsol = nsol+min+1;
                            else
                                if ((max<t)&&((max+min)>=t)) nsol = nsol+min-t+max+1;
                        continue;
                }
                if ((A[1]>0)&&(A[2]<0))
                {
                        if (i==S) { nsol = nsol+MIN(X[1],X[2])+1; continue; }
                        if (i<S)
                        {
                                t = S-i;
                                if (X[1]>=t)
                                   nsol = nsol+1+MIN(X[1]-t,X[2]);
                        }
                        else
                        {
                                t = i-S;
                                if (X[2]>=t)
                                   nsol = nsol+1+MIN(X[2]-t,X[1]);
                        }
                        continue;
                }
                if ((!A[1])&&(A[2]<0))
                {
                        if ((i>S)&&((i-S)<=X[2])) nsol = nsol+X[1]+1;
                        if (i==S) nsol = nsol+X[1]+1;
                        continue;
                }
                if ((A[1]+A[2])==-2)
                {
                        if (i<S) continue;
                        t = i-S;
                        min = MIN(X[1],X[2]);
                        max = MAX(X[1],X[2]);
                        if (t<=min) nsol = nsol+t+1;
                        else
                            if ((min<t)&&(t<=max)) nsol = nsol+min+1;
                            else
                                if ((max<t)&&((max+min)>=t)) nsol = nsol+min-t+max+1;
                        continue;
                }
        }
        printf("%lld\n", nsol);
}

int main()
{
        read();
        freopen("plus.out", "w", stdout);
        if ((X[0]*X[1]*X[2])<C1) n3();
        else
        if ((X[0]*X[1]*X[2])<C2) n2();
        else
        n();
        return 0;
}