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: