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: