Solução por Leonardo Paes
Não é necessário, mas é interessante dar uma olhada nesse curso antes de ir para a solução:
Seja a fatoração de primos do produtório . O número de divisores de
é
. Ao utilizarmos análise combinatória, percebemos que podemos escolher qualquer expoente para cada primo
que divide
, do expoente
ao expoente máximo de
que divide
.
Além disso, só pode ser das seguintes formas:
, onde
e
são ambos primos. Vamos provar isso por absurdo.
Suponha que tem mais do que
divisores primos distintos. Sejam eles
e
. Assim, sabemos que:
e
dividem
. Como o número de divisores é maior que
, a nossa suposição está errada. Portanto, como supomos que
tinha mais do que
divisores primos, sabemos que ele tem menos do que
. Agora, basta provarmos que o número de divisores de um inteiro da forma
está no intervalo de
até
. Os seus divisores são:
. Portanto, são
divisores. Note que se o número for primo, ele terá apenas
divisores.
Por outro lado, há numeros que só tem divisor primo. Se ele for um quadrado perfeito, ele terá:
e
como divisores, portanto,
. Agora, suponha que
seja da forma
. Seus divisores serão:
. Note que ele tem
divisores, ou seja, o número limite. Nesse caso, não há como existir
.
Agora que provamos as maneiras da fatoração em primos dos números dados, vamos calcular a resposta. Se a forma dele não for , é fácil de descobrirmos o primo que o divide. Em c++, podemos utilizar a função
, onde e é o expoente do primo. Note que é mais seguro retirar uma ou duas unidades desse numero e então ir somando +1 até que tal número elevado a
seja igual a
, já que
utiliza numeros decimais. Após descobrirmos se o número possui apenas um divisor primo, utilizaremos um
para guardarmos a frequencia desse primo.
Então, resta-nos saber o que fazer com os números da forma
. A ideia principal é: Suponha que não exista nenhum outro
. Isso quer dizer que:
. Para numeros desse tipo, multiplicaremos a resposta por
, pois
têm primos que nenhum outro
possui. Se existir outro número tal que
, há dois casos a considerarmos: Se o
deles for igual a eles, eles são o mesmo número, então podemos manter um vetor de frequencias pra cada número, e está resolvido. Caso contrário, manteremos um
pra cada
, guardando divisores primos distintos que formos verificando.
Por fim, basta percorrermos o vetor dado, checando a quantidade de divisores de .
- Se for 0, basta multiplicarmos a resposta por
.
- Se for 1, basta adicionarmos
em
.
- Se for 2, incrementaremos o
referente as frequências dos primos. (Note que no código não há if para esse caso, já que se fosse
virou
, e se for 0 não há nada a adicionar).
Para calcularmos a resposta, inicialmente fazemos , e então multiplicamos a resposta por quantidade de primos
, acrescentando
, como explicado previamente.
Código de exemplo: