From f978ffbfa1484bfed368d3f53f9b54df96fbadd5 Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Wed, 27 Nov 2024 12:44:42 +0100 Subject: [PATCH] Optimize problem 1 --- src/one.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/one.rs b/src/one.rs index 1498a50..a29c802 100644 --- a/src/one.rs +++ b/src/one.rs @@ -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 { - 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) }