In a way this is a math problem rather than a programming one.

First let's calculate the sum of the numbers smaller than X that are multiples of a divisor D.
We calculate the maximum multiple of D that is less than X, we call it M (X, D):
M (X, D) = ((X-1) integer_ division D) * D

In the case of divider 3: M (1000,3) = 999

We calculate the sum: 3 + 6 + ... + 996 + 999; which we call S (X, D)

This is a arithmetic progression , the sum of which is given by:

Where:

- a1 = D
- an = M (X, D)
- n = M (X, D) / D

That in java we calculate like this:

```
// Calcular S(X,D)
public static int sumaMultiplosMenores( int maximo, int divisor )
{
int maxMultiplo = ((maximo-1)/divisor)*divisor; // M(X,D)
int numTerminos = maxMultiplo/divisor; // n
return numTerminos*(maxMultiplo+divisor)/2; // S(X,D)
}
```

The final result is the sums of the multiples of 3 and 5 that are less than X, that is: S (1000.3) + S (1000.5)

But there is a problem, in doing the above we have added the multiples of 15 twice, to compensate for the subtractions once: Final result = S (1000.3) + S (1000.5) -S (1000.15) )

In java this is:

```
public static int metodo()
{
return sumaMultiplosMenores(1000, 3) +
sumaMultiplosMenores(1000, 5) -
sumaMultiplosMenores(1000, 15);
}
```

This form requires a constant execution time, while with a loop the time increases as X increases.