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 2no contaría si 2 x 2 x 3está presente).
Restricciones
1 < N <2 31
1 < M <30
Ejemplos
La entrada 30 2da salida 3, ya que se puede expresar de 3 maneras:
2 x 15
3 x 10
5 x 6
La entrada 16 3da salida 1, ya que solo hay un grupo distinto:
2 x 2 x 4
La entrada 2310 4da 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 4da 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
gcon argsGyHFuncionó en todos los argumentos de prueba, excepto el último, fue demasiado lento en ese pero no hay límite de tiempo dado.
fuente
Mque define la funcióngde 2 argumentos,GyH. 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 adicionalicomo 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 requeridoNporiy disminuimosM. Si no lo hacemos, aumentamosien 1, pero solo sii<N, ya que no sirve de nada revisar divisores mayores queN.Cuando el divisor mínimo
iexcedeN, 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==1oM+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
Naproximadamente 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<2MyN. ¡Gracias!Ruby, 67
Realmente razonablemente eficiente para una definición recursiva. Para cada par divisor
[d,q]de n,dsiendo 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
Men 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@Nestá dentro de las comillas, lo que lo hace fuera del alcance cuando ejecuta@C. También creo que terminarás contando duplicadosCONCATpara construir tus cadenas. Entonces puedes soltar elCONVERTs. IntentaSELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)en tuWHILEbucle. Debería ahorrarte un número razonable