Разумеется, в таких случаях неявно предполагается, что всевозможные значения, возникающие в ходе вычислений, не приводят к переполнению разрядности. Хотя формально, даже для записи натурального числа из диапазона от 1 до
![$M$ $M$](https://dxdy-04.korotkov.co.uk/f/f/b/9/fb97d38bcc19230b0acd442e17db879c82.png)
требуется
![$O(\log M)$ $O(\log M)$](https://dxdy-03.korotkov.co.uk/f/a/6/4/a6449ce825d18c806a52f4eff50697fb82.png)
памяти, но на практике почти всегда считают, что это
![$O(1)$ $O(1)$](https://dxdy-02.korotkov.co.uk/f/1/e/2/1e2f931ee6c0b8e7a51a7b0d123d514f82.png)
.
Но тут могут быть нюансы, действительно существенные на практике.
Есть, например, такая задачка: дан массив из
различных натуральных чисел, каждое из которых не превосходит
![$N$ $N$](https://dxdy-04.korotkov.co.uk/f/f/9/c/f9c4988898e7f532b9f826a75014ed3c82.png)
. Таким образом, в массиве есть все числа от 1 до
![$N$ $N$](https://dxdy-04.korotkov.co.uk/f/f/9/c/f9c4988898e7f532b9f826a75014ed3c82.png)
, кроме одного. Нужно его найти (разумеется, быстро, за
![$O(N)$ $O(N)$](https://dxdy-03.korotkov.co.uk/f/e/7/a/e7a2f022962441f2be6dc8e70e837b4a82.png)
времени и за вот эту вашу
![$O(1)$ $O(1)$](https://dxdy-02.korotkov.co.uk/f/1/e/2/1e2f931ee6c0b8e7a51a7b0d123d514f82.png)
дополнительной памяти).
Решение: сумма всех
![$N$ $N$](https://dxdy-04.korotkov.co.uk/f/f/9/c/f9c4988898e7f532b9f826a75014ed3c82.png)
чисел от 1 до
![$N$ $N$](https://dxdy-04.korotkov.co.uk/f/f/9/c/f9c4988898e7f532b9f826a75014ed3c82.png)
известна, нужно из неё вычесть по очереди все числа массива, и то, что получится, и будет искомым числом.
Конечно же, здесь неявно подразумевается, что сумма (
![$N(N+1)/2$ $N(N+1)/2$](https://dxdy-04.korotkov.co.uk/f/3/3/3/333f90494aff2ec0cfdd29d154b96dac82.png)
) умещается в диапазон представимых целых чисел.
Модифицируем задачу: теперь чисел
![$N-2$ $N-2$](https://dxdy-04.korotkov.co.uk/f/7/7/c/77c55bdd07e1d083dfec8f36dfd282bf82.png)
, и нужно найти два отсутствующих числа.
Возможное решение: рассчитаем произведение
![$N!$ $N!$](https://dxdy-02.korotkov.co.uk/f/9/0/0/900e33afa17693e3b82926d312f5366682.png)
и сумму
![$N(N+1)/2$ $N(N+1)/2$](https://dxdy-04.korotkov.co.uk/f/3/3/3/333f90494aff2ec0cfdd29d154b96dac82.png)
всех чисел от 1 до
![$N$ $N$](https://dxdy-04.korotkov.co.uk/f/f/9/c/f9c4988898e7f532b9f826a75014ed3c82.png)
, далее будем (делить на/вычитать из него) все числа массива последовательно, пока не получим произведение и сумму двух искомых чисел. Потом воспользуемся теоремой Виета, решим квадратное уравнение и получим сами числа.
Всё так же просто и красиво, но вот тут уже есть нюанс.
![$N!$ $N!$](https://dxdy-02.korotkov.co.uk/f/9/0/0/900e33afa17693e3b82926d312f5366682.png)
имеет разрядность
![$O(N)$ $O(N)$](https://dxdy-03.korotkov.co.uk/f/e/7/a/e7a2f022962441f2be6dc8e70e837b4a82.png)
, и тут уже нельзя подразумевать, что его результат влезет в диапазон представления машинного числа. Собственно, и вычислить
![$N!$ $N!$](https://dxdy-02.korotkov.co.uk/f/9/0/0/900e33afa17693e3b82926d312f5366682.png)
за время
![$O(N)$ $O(N)$](https://dxdy-03.korotkov.co.uk/f/e/7/a/e7a2f022962441f2be6dc8e70e837b4a82.png)
никак не получится.