Solução por Leonardo Paes
Conhecimento prévio necessário:
Para resolvermos esse problema, uma observação importante para que um intervalo seja válido é:
, onde
é o mínimo
no intervalo
e
é o máximo divisor comum do intervalo
do vetor
.
Uma maneira de provar isso é: Suponha que existe um inteiro que divide um outro inteiro
, tal que
. Isso por si só gera um absurdo, pois o maior divisor de
é
.
Então, está provado por absurdo que deve ser verdade para que o intervalo
seja um candidato à resposta.
Então, suponha que nós fixemos como parte de um intervalo
tal que
. Para cada inteiro
, nós iremos fixá-lo. Para saber o maior intervalo que contém
, podemos fazer duas buscas binárias, uma tentando diminuir ao máximo o
do intervalo, e outra tentando aumentar ao máximo o
do intervalo. Para checarmos se as respectivas bordas mantém a condição
verdadeira, iremos utilizar uma estrutura de dados que nos responde, para qualquer intervalo
do vetor
, o seu mínimo e o seu máximo divisor comum, em
.
Essa estrutura de dados é chamada de Sparse Table. Iremos utilizar duas Sparse Tables, uma de mínimo e outra de máximo. Note que ambas as operações são comutativas, ou seja, a ordem das operações não altera o resultado. Portanto, elas satisfazem o pré-requisito para que a Sparse Table funcione!
Código de Exemplo: