Largest Product in a Series
Given a 1000-digit number D = d_0 d_1... d_999 (where each d_i in {0, 1,..., 9}), find the maximum product of 13 consecutive digits: M = max_(0 <= i <= 987) prod_(j=0)^12 d_(i+j).
Problem Statement
This archive keeps the full statement, math, and original media on the page.
The four adjacent digits in the \(1000\)-digit number that have the greatest product are \(9 \times 9 \times 8 \times 9 = 5832\). \begin {align*} 73167176531330624919225119674426574742355349194934 \\ 96983520312774506326239578318016984801869478851843 \\ 85861560789112949495459501737958331952853208805511 \\ 12540698747158523863050715693290963295227443043557 \\ 66896648950445244523161731856403098711121722383113 \\ 62229893423380308135336276614282806444486645238749 \\ 30358907296290491560440772390713810515859307960866 \\ 70172427121883998797908792274921901699720888093776 \\ 65727333001053367881220235421809751254540594752243 \\ 52584907711670556013604839586446706324415722155397 \\ 53697817977846174064955149290862569321978468622482 \\ 83972241375657056057490261407972968652414535100474 \\ 82166370484403199890008895243450658541227588666881 \\ 16427171479924442928230863465674813919123162824586 \\ 17866458359124566529476545682848912883142607690042 \\ 24219022671055626321111109370544217506941658960408 \\ 07198403850962455444362981230987879927244284909188 \\ 84580156166097919133875499200524063689912560717606 \\ 05886116467109405077541002256983155200055935729725 \\ 71636269561882670428252483600823257530420752963450 \end {align*}
Find the thirteen adjacent digits in the \(1000\)-digit number that have the greatest product. What is the value of this product?
Problem 8: Largest Product in a Series
Mathematical Development
Window Products
Definition 1. For integers and with , define the window product
For this problem, and , so there are
candidate windows.
Theorem 1 (Exhaustive search is sufficient). The desired quantity is
so evaluating all window products and retaining the largest one yields the correct answer.
Proof. The set
is finite. Therefore it has a maximum element. An exhaustive search computes every element of and returns the largest value encountered, which is exactly .
Lemma 1 (Zero windows). If one of the digits in a length-13 window is zero, then the product of that window is zero.
Proof. A product containing a factor equal to zero is zero.
Remark. Lemma 1 explains why many windows are automatically non-optimal, but the reference implementation does not need any special-case optimization: it simply computes all products directly.
Numerical Evaluation
Proposition 1. The maximum product is attained by the 13-digit block
which begins at index (using zero-based indexing), and its product is
Proof. Exhaustive evaluation of the window products shows that the largest one occurs for the block
Its product is computed directly as
Hence the maximal product is .
Editorial
We enumerate every block of consecutive digits in the 1000-digit string. For each starting position we multiply the digits in that window and compare the product against the current maximum. This exhaustive scan is sufficient because every admissible length- substring appears exactly once as some window.
Theorem 2 (Algorithm correctness). LargestProductInSeries(d, k) returns the largest product of consecutive digits.
Proof. For each index with , the inner loop computes exactly
The outer loop visits every admissible starting position exactly once and keeps the maximum value seen so far in best. By Theorem 1, the maximum over these values is precisely the desired quantity. Therefore the returned value is correct.
Pseudocode
Algorithm: Maximum Product of Consecutive Digits
Require: A digit string d_1 d_2 ... d_m and a window length k.
Ensure: The maximum product of k consecutive digits in the string.
1: Interpret the input as a sequence of decimal digits and initialize best ← 0.
2: For each starting position i with i + k - 1 ≤ m do:
3: Compute P ← product of the k digits beginning at position i.
4: If P > best, set best ← P.
5: Return best.
Complexity Analysis
Theorem 3. The algorithm runs in time and uses space in the given implementation.
Proof. There are exactly windows, and for each window the inner loop performs exactly multiplications. Hence the running time is
For this problem,
so the computation is tiny. The Python implementation first stores the 1000 digits in a list, which uses space; aside from that list, only a constant number of scalar variables are maintained.
Answer
Code
Each problem page includes the exact C++ and Python source files from the local archive.
#include <bits/stdc++.h>
using namespace std;
int main() {
string num =
"73167176531330624919225119674426574742355349194934"
"96983520312774506326239578318016984801869478851843"
"85861560789112949495459501737958331952853208805511"
"12540698747158523863050715693290963295227443043557"
"66896648950445244523161731856403098711121722383113"
"62229893423380308135336276614282806444486645238749"
"30358907296290491560440772390713810515859307960866"
"70172427121883998797908792274921901699720888093776"
"65727333001053367881220235421809751254540594752243"
"52584907711670556013604839586446706324415722155397"
"53697817977846174064955149290862569321978468622482"
"83972241375657056057490261407972968652414535100474"
"82166370484403199890008895243450658541227588666881"
"16427171479924442928230863465674813919123162824586"
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408"
"07198403850962455444362981230987879927244284909188"
"84580156166097919133875499200524063689912560717606"
"05886116467109405077541002256983155200055935729725"
"71636269561882670428252483600823257530420752963450";
int k = 13, n = num.size();
long long best = 0;
for (int i = 0; i + k <= n; i++) {
long long prod = 1;
for (int j = 0; j < k; j++)
prod *= (num[i + j] - '0');
best = max(best, prod);
}
cout << best << endl;
return 0;
}
from math import prod
def solve():
NUMBER = (
"73167176531330624919225119674426574742355349194934"
"96983520312774506326239578318016984801869478851843"
"85861560789112949495459501737958331952853208805511"
"12540698747158523863050715693290963295227443043557"
"66896648950445244523161731856403098711121722383113"
"62229893423380308135336276614282806444486645238749"
"30358907296290491560440772390713810515859307960866"
"70172427121883998797908792274921901699720888093776"
"65727333001053367881220235421809751254540594752243"
"52584907711670556013604839586446706324415722155397"
"53697817977846174064955149290862569321978468622482"
"83972241375657056057490261407972968652414535100474"
"82166370484403199890008895243450658541227588666881"
"16427171479924442928230863465674813919123162824586"
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408"
"07198403850962455444362981230987879927244284909188"
"84580156166097919133875499200524063689912560717606"
"05886116467109405077541002256983155200055935729725"
"71636269561882670428252483600823257530420752963450"
)
K = 13
digits = [int(c) for c in NUMBER]
return max(prod(digits[i:i + K]) for i in range(len(digits) - K + 1))
answer = solve()
assert answer == 23514624000
print(answer)