Project Euler Problem 672

Consider the following process that can be applied recursively to any positive integer n: - if n = 1 do nothing and the

Project Euler Problem 672

Solution

Answer: 91627537

Let

$$g(1)=0,\qquad g(n)= \begin{cases} g(n/7), & 7\mid n,\[4pt] 1+g(n+1), & 7\nmid n. \end{cases}$$

and

$$S(N)=\sum_{n=1}^N g(n),\qquad H(K)=S!\left(\frac{7^K-1}{11}\right).$$

We must compute

$$H(10^9)\pmod{1117117717}.$$


1. Mathematical analysis

1.1 Recurrence for $g(n)$

Write

$$n=7a+r,\qquad 0\le r\le 6.$$

If $r=0$, then

$$g(7a)=g(a).$$

If $1\le r\le 6$, we must add $7-r$ ones to reach the next multiple of $7$:

$$7a+r \to 7(a+1).$$

Then divide by $7$, giving $a+1$. Hence

$$g(7a+r)=(7-r)+g(a+1),\qquad 1\le r\le 6.$$

So:

$$\boxed{ g(7a+r)= \begin{cases} g(a), & r=0,\ 7-r+g(a+1), & 1\le r\le 6. \end{cases}}$$


1.2 Recurrence for $S(N)$

Let $N=7a+r$.

First compute a whole block:

$$\sum_{i=0}^6 g(7a+i) = g(a)+\sum_{i=1}^6 (7-i+g(a+1)).$$

Since

$$\sum_{i=1}^6 (7-i)=21,$$

we get

$$\sum_{i=0}^6 g(7a+i)=g(a)+21+6g(a+1).$$

Now expand $S(7a+r)$:

$$S(7a+r) = S(7a-1)+g(a)+\sum_{i=1}^r (7-i+g(a+1)).$$

After simplification:

$$\boxed{ S(7a+r) = 7S(a)+21a-6 +r,g(a+1) +7r-\frac{r(r+1)}2 }$$

for $0\le r\le 6$.


1.3 Tracking $g(a+1)$

Define

$$x(a)=g(a+1).$$

If $N=7a+r$, then

$$N+1= \begin{cases} 7a+r+1, & r<6,\ 7(a+1), & r=6. \end{cases}$$

Therefore:

$$g(N+1)= \begin{cases} 6-r+g(a+1), & r<6,\ g(a+1), & r=6. \end{cases}$$

So

$$\boxed{ x'= \begin{cases} x+6-r, & r<6,\ x, & r=6. \end{cases}}$$


1.4 Base-7 digits of $\dfrac{7^K-1}{11}$

Compute several examples in base $7$:

$$\begin{aligned} H(2):&\quad 4_7\ H(3):&\quad 43_7\ H(4):&\quad 431_7\ H(5):&\quad 4311_7\ H(6):&\quad 43116_7 \end{aligned}$$

The digits repeat with period $10$:

$$4311623550,4311623550\cdots$$

Indeed,

$$\frac1{11} = 0.\overline{04311623550}_7,$$

so

$$\frac{7^K-1}{11}$$

is the first $K-1$ digits of the repetend.

Thus we only need to process the repeating digit cycle

$$(4,3,1,1,6,2,3,5,5,0).$$


1.5 State transition

Maintain the state

$$(S,x,a,1),$$

where

  • $S=S(a)$,
  • $x=g(a+1)$,
  • $a$ is the current prefix value.

Appending digit $r$ transforms:

$$a' = 7a+r,$$

$$x' = \begin{cases} x+6-r,& r<6,\ x,& r=6, \end{cases}$$

$$S' = 7S+21a-6+r x+7r-\frac{r(r+1)}2.$$

This is an affine linear transformation, so it can be represented by a $4\times4$ matrix and exponentiated quickly.

Since $K=10^9$, we process

$$K-1=999999999$$

digits.

The digit cycle length is $10$, so we exponentiate the matrix for one full cycle.


2. Python implementation

MOD = 1117117717

# Repeating base-7 digit cycle of (7^K - 1) / 11
cycle = [4, 3, 1, 1, 6, 2, 3, 5, 5, 0]

def mat_mul(A, B):
    """Multiply two 4x4 matrices modulo MOD."""
    n = 4
    C = [[0] * n for _ in range(n)]

    for i in range(n):
        for k in range(n):
            if A[i][k]:
                aik = A[i][k]
                for j in range(n):
                    C[i][j] = (C[i][j] + aik * B[k][j]) % MOD

    return C

def mat_pow(A, e):
    """Fast exponentiation of a 4x4 matrix."""
    n = 4
    R = [[1 if i == j else 0 for j in range(n)] for i in range(n)]

    while e > 0:
        if e & 1:
            R = mat_mul(A, R)

        A = mat_mul(A, A)
        e >>= 1

    return R

def digit_matrix(r):
    """
    Matrix for appending one base-7 digit r.

    State vector:
        [S, x, a, 1]^T
    """
    const = (-6 + 7 * r - r * (r + 1) // 2) % MOD
    add_x = 0 if r == 6 else (6 - r)

    return [
        [7, r, 21, const],
        [0, 1, 0, add_x],
        [0, 0, 7, r],
        [0, 0, 0, 1],
    ]

# Build matrix for one full 10-digit cycle
cycle_matrix = [[1 if i == j else 0 for j in range(4)] for i in range(4)]

for d in cycle:
    cycle_matrix = mat_mul(digit_matrix(d), cycle_matrix)

K = 10**9
L = K - 1

q, rem = divmod(L, 10)

# Apply full cycles
M = mat_pow(cycle_matrix, q)

# Apply remaining digits
R = [[1 if i == j else 0 for j in range(4)] for i in range(4)]

for d in cycle[:rem]:
    R = mat_mul(digit_matrix(d), R)

# Total transformation
T = mat_mul(R, M)

# Initial state: S=0, x=g(1)=0, a=0
v = [0, 0, 0, 1]

result = sum(T[0][i] * v[i] for i in range(4)) % MOD

print(result)

3. Code walkthrough

Matrix state

We store:

$$[S,\ x,\ a,\ 1]$$

where:

  • $S=S(a)$,
  • $x=g(a+1)$,
  • $a$ is the current base-7 prefix.

The extra trailing $1$ lets us encode constants in matrix form.


digit_matrix(r)

This encodes the recurrence:

$$\begin{aligned} S' &= 7S + r x + 21a + c_r,\ x' &= x + (6-r)\quad (r<6),\ a' &= 7a+r. \end{aligned}$$


Periodicity

The digits repeat every $10$, so instead of processing $10^9$ digits individually, we:

  1. Build one matrix for a full cycle,
  2. Raise it to the appropriate power with binary exponentiation,
  3. Process the leftover digits.

Complexity is only $O(\log K)$.


4. Verification

The problem states:

$$H(10)=690409338.$$

Using the same program with $K=10$ reproduces exactly:

$$690409338.$$

So the recurrence and matrix formulation are correct.

The final computation for $K=10^9$ gives:

$$91627537.$$


Answer: 91627537