Optimize problem 1

This commit is contained in:
Quentin Boyer 2024-11-27 12:44:42 +01:00
parent 567a649c7d
commit f978ffbfa1

View file

@ -6,12 +6,25 @@ pub struct Args {
pub until: u64,
}
fn multiple_sum_until(m: u64, n: u64) -> u64 {
let k = n / m;
m * k * (k + 1) / 2
}
impl Problem for Args {
type Solution = u64;
// We could derive it mathematically, ... or write a dump loop
// Multiple of threes:
// 3 6 9 12 ... = 3 * 1 + 3 * 2 + 3 * 3 ... = 3 * (1 + 2 + 3 ...)
// Identically multiples of 5: 5 * (1 + 2 + 3 ...)
//
// We need all multiples such that 3 * n < X, n < X / 3
fn solve(self, _: GlobalArgs) -> color_eyre::Result<u64> {
let sum = (0..self.until).filter(|x| x % 3 == 0 || x % 5 == 0).sum();
let three_sum = multiple_sum_until(3, self.until - 1);
let five_sum = multiple_sum_until(5, self.until - 1);
let fifteen_sum = multiple_sum_until(15, self.until - 1);
let sum = three_sum + five_sum - fifteen_sum;
Ok(sum)
}