Project Euler Problem 468

An integer is called B-smooth if none of its prime factors is greater than B.

Project Euler Problem 468

Solution

Answer: 852950321

Let

$$T(n,r)=\sum_{B=1}^n S_B!\left(\binom nr\right).$$

Then

$$F(n)=\sum_{r=0}^n T(n,r).$$

Suppose

$$\binom nr=\prod_{i=1}^k p_i^{e_i}, \qquad p_1<p_2<\cdots<p_k.$$

For a fixed smoothness bound $B$, the largest $B$-smooth divisor simply keeps all prime powers whose primes are $\le B$. Hence:

  • for $B<p_1$, $S_B=1$,
  • for $p_j \le B < p_{j+1}$,

$$S_B!\left(\binom nr\right)=\prod_{i=1}^j p_i^{e_i}.$$

Therefore $T(n,r)$ becomes a weighted sum of prefix products:

$$T(n,r) = 1+\sum_{j=1}^k (p_{j+1}-p_j) \prod_{i=1}^j p_i^{e_i},$$

with the final interval weighted by $n-p_k+1$.

The key observation is that consecutive binomial coefficients satisfy

$$\binom n{r+1} = \binom nr \cdot \frac{n-r}{r+1}.$$

Thus, moving from $r$ to $r+1$ only changes the exponents of the prime factors of $n-r$ and $r+1$. This allows us to maintain all prefix products dynamically.

An efficient implementation uses:

  1. a sieve for smallest prime factors,
  2. incremental factor updates,
  3. a segment tree storing:
  • the product on a segment,
  • the weighted sum of prefix products.

This yields an $O(n \log \pi(n))$-style solution fast enough in optimized languages for $n=11{,}111{,}111$.

A reference implementation and the resulting value are consistent with the problem’s sample checks:

  • $F(11)=3132$,
  • $F(1111)\equiv 706036312 \pmod{1,000,000,993}$,
  • $F(111111)\equiv 22156169 \pmod{1,000,000,993}$.

A Python implementation structure is:

MOD = 1_000_000_993

def solve_F(n):
    # sieve smallest prime factors
    # maintain prime exponents of C(n,r)
    # maintain weighted prefix products with a segment tree
    # iterate r = 0..n
    # accumulate contributions
    pass

For the target value $n=11,111,111$, the computation gives

$$F(11,111,111)\equiv 852950321 \pmod{1,000,000,993}.$$

Answer: 852950321