Dado um número inteiro N , conte quantas maneiras ele pode ser expresso como um produto de M números inteiros> 1.
A entrada é simplesmente N e M e a saída é a contagem total de grupos inteiros distintos . Ou seja, você pode usar um número inteiro mais de uma vez, mas cada grupo deve ser distinto ( 3 x 2 x 2
não contaria se 2 x 2 x 3
estiver presente).
Restrições
1 < N <2 31
1 < M <30
Exemplos
A entrada 30 2
fornece saída 3
, pois pode ser expressa de três maneiras:
2 x 15
3 x 10
5 x 6
A entrada 16 3
fornece saída 1
, pois há apenas um grupo distinto:
2 x 2 x 4
Entrada 2310 4
fornece saída 10
:
5 x 6 x 7 x 11
3 x 7 x 10 x 11
3 x 5 x 11 x 14
3 x 5 x 7 x 22
2 x 7 x 11 x 15
2 x 5 x 11 x 21
2 x 5 x 7 x 33
2 x 3 x 11 x 35
2 x 3 x 7 x 55
2 x 3 x 5 x 77
A entrada 15 4
fornece saída 0
, pois não pode ser feita.
Regras
Aplicam-se brechas de golfe de código padrão, juntamente com definições padrão de entrada / saída. As respostas podem ser uma função ou um programa completo. Funções internas para fatoração e / ou particionamento não são permitidas, mas outras são boas. O código é contado em bytes.
Respostas:
Pyth -
24232221 bytesNão é uma solução complicada. Vai jogar mais. Apenas leva produto cartesiano de listas e filtros. A mesma estratégia do @optimizer (acho que por causa de seu comentário, na verdade não decifrou esse CJam) Graças a @FryAmTheEggman por 2 bytes e engane com M.
Define uma função
g
com argsG
eH
O trabalho em todos os argumentos de teste, exceto o último, foi lento demais, mas não há limite de tempo.
fonte
M
que define a funçãog
de 2 argumentosG
eH
. Isto é o que eu recebo para isso:Ml{msdfqu*GHT1G^r2GH
. Sempre bom ver outro usuário Pyth :)72 3
, que retorna 5, mas há, de facto 6 respostas,(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
Python 3, 59
Contamos potenciais divisores
i
. Com o argumento adicionali
como o divisor mais baixo permitido, a relação recursiva principal éPara cada um
i
, escolhemos incluí-lo (possível como repetição); nesse caso, dividimos o produto necessárioN
pori
e diminuímosM
. Se não o fizermos, aumentamosi
em 1, mas apenas sei<N
, já que não adianta verificar divisores maiores queN
.Quando o divisor mínimo
i
excedeN
, não há mais divisores em potencial. Portanto, verificamos se conseguimos ver seM==0 and N==1
, ou, equivalentementeM+1==N==1
ouM+1==N<2
, desde quandoM+1==N
, o valor mútuo é garantido como um número inteiro positivo (obrigado a FryAmTheEggman por essa otimização).Esse código causará um estouro de pilha para
N
cerca de 1000 na maioria dos sistemas, mas você pode executá-lo no Stackless Python para evitar isso. Além disso, é extremamente lento por causa de sua ramificação recursiva exponencial.fonte
-~M==N<2
M
eN
. Obrigado!Ruby, 67
Realmente razoavelmente eficiente para uma definição recursiva. Para cada par divisor
[d,q]
de n,d
sendo o menor, somamos o resultado def[q,m-1]
. A parte complicada é que, nas chamadas internas, limitamos os fatores a valores maiores ou iguais a d, para não acabarmos contando duas vezes.fonte
CJam, 48 bytes
Isso pode ser muito mais curto, mas eu adicionei algumas verificações para fazê-lo funcionar com um número decente
M
no compilador online.Experimente online aqui
fonte
2 1
. Saída esperada: 1. Saída real: 0.T-SQL
456373Tenho certeza de que isso quebrará quando as entradas estiverem perto de serem grandes.
Agradecemos ao @MickyT por ajudar a salvar muitos caracteres com CONCAT e SELECTing em vez de vários SETs.
fonte
SET @C+=',# A'+@
e:SET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
SET @C+=@D+'=@N'+@E+' SELECT @'
. O@N
está dentro das aspas, tornando-o fora do escopo quando você executa@C
. Também acho que você vai acabar contando duplicatasCONCAT
para criar suas strings. Então você pode soltar osCONVERT
. TenteSELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)
no seuWHILE
loop. Deve poupar um número razoável