Dado l e r, encontre o número de pares de números naturais de l a r que AND bit a bit é igual a 0.
Limites:
1 <= l <= r <= 10^9
r - l <= 10^6
Eu só poderia escrever uma força bruta. Alguém tem alguma ideia de como resolver essa tarefa? O tamanho do intervalo é de até 10^6, então poderíamos usar isso de alguma forma.
Primeiro escreva a seguinte função:
Você pode escrever isso com seu ponto sobre os bits - você apenas encontra os maiores bits diferentes de zero que podem funcionar permanecendo no intervalo, remove os bits que DEVEM ser 0 e você tem a representação de base 2 de um a menos que o número de ands que atendem a condição. (O truque da contagem falhou
0
.)E agora usamos o seguinte fato. Suponha que
x & y == 0
. Então:(2*x) & (2*y) == 0
(2*x + 1) & (2*y) == 0
(2*x) & (2*y + 1) == 0
Mas
(2*x + 1) & (2*y + 1) == 1
.Portanto, podemos emparelhar a maior parte do intervalo de
l
ar
, diminuir a parte inferior del
er
para obter um intervalo menor, contar os ands do intervalo e, em seguida, multiplicar por 3. Também precisamos ter cuidado com os limites. Assim, obtemos algo assim:Serão apenas 20 chamadas recursivas para um intervalo trivial. Então deve ser bem rápido.