Dado un entero N , cuente cuántas formas puede expresarse como producto de M enteros> 1.
La entrada es simplemente N y M , y la salida es el recuento total de distintos grupos enteros. Lo que significa que puede usar un número entero más de una vez, pero cada grupo debe ser distinto ( 3 x 2 x 2
no contaría si 2 x 2 x 3
está presente).
Restricciones
1 < N <2 31
1 < M <30
Ejemplos
La entrada 30 2
da salida 3
, ya que se puede expresar de 3 maneras:
2 x 15
3 x 10
5 x 6
La entrada 16 3
da salida 1
, ya que solo hay un grupo distinto:
2 x 2 x 4
La entrada 2310 4
da salida 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
La entrada 15 4
da salida 0
, ya que no se puede hacer.
Reglas
Se aplican las lagunas de código de golf estándar, junto con las definiciones estándar de entrada / salida. Las respuestas pueden ser una función o un programa completo. Las funciones integradas para la factorización y / o particionamiento no están permitidas, pero otras están bien. El código se cuenta en bytes.
Respuestas:
Pyth -
24232221 bytesNo es una solución complicada. Estaremos jugando más al golf. Solo toma producto cartesiano de listas y filtros. La misma estrategia que @optimizer (supongo que debido a su comentario, en realidad no descifró ese CJam) Gracias a @FryAmTheEggman por 2 bytes y truco con M.
Define una función
g
con argsG
yH
Funcionó en todos los argumentos de prueba, excepto el último, fue demasiado lento en ese pero no hay límite de tiempo dado.
fuente
M
que define la funcióng
de 2 argumentos,G
yH
. Esto es lo que me pasa por la siguiente:Ml{msdfqu*GHT1G^r2GH
. Siempre es agradable ver a otro usuario de Pyth :)72 3
, que devuelve 5, pero de hecho hay 6 respuestas,(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
Pitón 3, 59
Contamos divisores potenciales
i
. Con el argumento adicionali
como el divisor más bajo permitido, la relación recursiva central esPara cada uno
i
, elegimos incluirlo (posible como una repetición), en cuyo caso dividimos el producto requeridoN
pori
y disminuimosM
. Si no lo hacemos, aumentamosi
en 1, pero solo sii<N
, ya que no sirve de nada revisar divisores mayores queN
.Cuando el divisor mínimo
i
excedeN
, no hay más divisores potenciales. Por lo tanto, verificamos si hemos tenido éxito al ver siM==0 and N==1
, o, de manera equivalente,M+1==N==1
oM+1==N<2
, desde entoncesM+1==N
, se garantiza que el valor mutuo sea un número entero positivo (gracias a FryAmTheEggman por esta optimización).Este código provocará un desbordamiento de la pila durante
N
aproximadamente 1000 en la mayoría de los sistemas, pero puede ejecutarlo en Stackless Python para evitar esto. Además, es extremadamente lento debido a su ramificación recursiva exponencial.fuente
-~M==N<2
M
yN
. ¡Gracias!Ruby, 67
Realmente razonablemente eficiente para una definición recursiva. Para cada par divisor
[d,q]
de n,d
siendo el más pequeño, sumamos el resultado def[q,m-1]
. La parte difícil es que en las llamadas internas, limitamos los factores a unos mayores o iguales a d para que no terminemos de contar dos veces.fuente
CJam, 48 bytes
Esto puede ser mucho más corto, pero he agregado ciertas comprobaciones para que funcione en un número decente
M
en el compilador en línea.Pruébalo en línea aquí
fuente
2 1
. Salida esperada: 1. Salida real: 0.T-SQL
456373Estoy seguro de que esto se romperá cuando las entradas estén incluso cerca de ser grandes.
Gracias a @MickyT por ayudar a guardar muchos caracteres con CONCAT y SELECTing en lugar de múltiples SET.
fuente
SET @C+=',# A'+@
ySET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
SET @C+=@D+'=@N'+@E+' SELECT @'
. El@N
está dentro de las comillas, lo que lo hace fuera del alcance cuando ejecuta@C
. También creo que terminarás contando duplicadosCONCAT
para construir tus cadenas. Entonces puedes soltar elCONVERT
s. IntentaSELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)
en tuWHILE
bucle. Debería ahorrarte un número razonable