A solution with complexity
:
For each second, starting with
, we compute a matrix of
s and
s, where a
denotes a square reachable by the knight in the respective second. The matrix for second
has
s in all positions, except for the starting position of the knight. From each matrix, we can compute the matrix for the next second, up to second
. The next matrix is computed by mapping all
s to all squares reachable by any of the
possible jumps from that square, and then zeroing out all positions blocked during the next second.
The memory complexity of this algorithm is
, since we need only two matrices (the current and the next one) at any moment. This solution is worth
of points.
A solution with complexity
:
Instead of the matrix of
s and
s, we will use a sequence of numbers, where each number represents a row of the matrix and its binary digits correspond to the
s and
s from the previous solution. For simplicity, we will continue to use the term matrix in the remainder of the description.
The mapping of
s in all
directions can now be implemented using bit operations, which is more efficient than the previous solution.
The remaining problem is quickly computing the matrix of squares blocked in second
. Notice that if
is divisible by
, then the square
is blocked during second
.
If
is greater than
, we can simply generate all moments when the square will be blocked, since there will be less than
such moments.
If
is less than
, the problem can be solved using prime factorization. Notice that, if
divides
, all prime factors of
(including the ones with exponent
) must have greater or equal exponents than the corresponding exponents in the factorization of
.
Let us denote by
the matrix with a
in position
if
is greater than or equal to the exponent of the prime number
in the factorization of
.
Now the matrix of squares blocked in second
can be expressed as:

where
are all primes less than
,
are their exponents in the factorization of
, and
is the bitwise AND operation.
The direct computation of the above expression
is slow. However, notice that at most
primes in a factorization will have positive exponents, while all other exponents will be
.
Before the main algorithm, we will precompute, for each interval
, the following:

The expression
can now be quickly computed by using
for all primes with a positive exponent, and the precomputed
for all other primes (with exponents of
, grouped in at most
intervals), combining all values with a bitwise AND.
Now that we can compute the matrix of squares blocked in second
, we can simply apply it to the current matrix of possible positions using a bitwise AND, thus obtaining the final matrix for second
.
Comments