N을 M 정수의 곱으로 쓰는 방법은 몇 가지입니까?


12

정수 N이 주어지면 M 정수> 1 의 곱으로 표현할 수있는 방법의 수를 세십시오 .

입력은 단순히 NM 이며 출력은 고유 한 정수 그룹 의 총 수입니다 . 즉, 정수를 두 번 이상 사용할 수 있지만 각 그룹은 고유해야합니다 (있는 3 x 2 x 2경우 계산되지 않음 2 x 2 x 3).

제약

1 < N <2 31
1 < M <30

입력 30 233 가지 방식으로 표현 될 수 있으므로 output을 제공 합니다.

2 x 15
3 x 10
5 x 6

별개의 그룹이 하나뿐이므로 Input 16 3은 output을 제공합니다 1.

2 x 2 x 4

입력 2310 4은 출력을 제공합니다 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

입력 15 40수행 할 수 없으므로 출력을 제공 합니다.

규칙

표준 코드 골프 허점은 입력 / 출력에 대한 표준 정의와 함께 적용됩니다. 답변은 기능 또는 전체 프로그램 일 수 있습니다. 인수 분해 및 / 또는 파티셔닝을위한 내장 기능은 허용되지 않지만 다른 기능은 괜찮습니다. 코드는 바이트 단위로 계산됩니다.


파티셔닝이란 무엇입니까?
Optimizer

@Optimizer 겹치지 않는 하위 목록으로 목록을 그룹화합니다. Mathematica 와 같은 일부 언어에는이 기능이 내장되어 있습니다.
Geobits

시간 제한이 있습니까? 특히 순진한 알고리즘은 많은 M 값을 얻기 위해 수세기가 걸릴 수 있습니다. sqrt (N)보다 큰 요소는 분명히 큰 도움이됩니다.
레벨 리버 St

1
@steveverrill N 의 상한을 고려할 때 최대 30 개의 (프라임) 요소 만 있어야하므로 속도가 약간 빨라집니다. 그러나 순진하게 자유롭게 느끼십시오. 알고리즘이 몇 시간 내에 답변을 제공하지 않을 경우 잘 설명 된 개념 증명이 유권자들이 결정하는 데 도움이 될 수 있습니다.
Geobits

두 목록의 직교 곱을 수행 할 수있는 내장이 허용됩니까?
Optimizer

답변:


5

Pyth - 24 23 22 21 바이트

복잡한 해결책이 아닙니다. 더 골프가 될 것입니다. 목록과 필터의 데카르트 곱만 가져옵니다. @optimizer와 같은 전략 (그의 의견 때문에 추측하고 실제로 CJam을 해독하지는 못했습니다) 2 바이트에 대한 @FryAmTheEggman 덕분에 M으로 트릭합니다.

Ml{m`Sdfqu*GHT1G^r2GH

gargs 로 함수 를 정의 G하고H

M                    function definition of g with args G and H
 l                   length of
  {                  set (eliminates duplicates)
   m                 map
    `Sd              repr of sorted factors so can run set (on bash escape ` as \`)
    f                filter
     q      G        equals first arg
      u*GHT1         reduce by multiplication
     ^     H         cartesian product by repeat second arg
       r2G           range 2 to first arg

마지막을 제외한 모든 테스트 인수에 대한 작업은 그 속도가 너무 느리지 만 시간 제한은 없습니다.


해당 형식으로 입력하면됩니다.
Geobits

1
Pyth 골프 팁 : 당신은 2 개 인자를 얻는 경우에, 그것을 사용하는 것이 짧은 M기능 정의 g, 2 개 인자를 G하고 H. 이것이 내가 얻는 것입니다 : Ml{msdfqu*GHT1G^r2GH. 항상 다른 Pyth 사용자를 만나서 반갑습니다 :)
FryAmTheEggman

@FryAmTheEggman은 팁을 주셔서 감사합니다.
Maltysen

1
이것은 input에 대해 잘못된 답변을 제공하는 것 같습니다. 72 35를 반환하지만 실제로 6 개의 답변이 있습니다(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
isaacg

1
@isaacg oh ok, 나는 그것을 내 21 문자 버전으로 되돌릴 것입니다. 나는 그것을 합산하는 것이 효과가 있다고 생각하지는 않았지만 그렇게 보였으므로 다시 repr로 돌아갈 것입니다. 캐치 주셔서 감사합니다.
Maltysen

9

파이썬 3, 59

f=lambda N,M,i=2:i<=N and f(N/i,M-1,i)+f(N,M,i+1)or-~M==N<2

우리는 잠재적 제수를 계산합니다 i. i가장 낮은 허용 제수로 추가 인수 를 사용하면 핵심 재귀 관계는 다음과 같습니다.

f(N,M,i)=f(N/i,M-1,i)+f(N,M,i+1)

각각에 대해 i, 우리는 하나이 경우 우리가 필요한 제품을 분할, 그것은 (반복 가능한)을 포함하도록 선택 N에 의해 i및 감소 M. 그렇지 않으면 i1 보다 크게 증가 하지만 i<N,보다 큰 제수를 검사하는 사용이 없기 때문에 에만 증가 합니다 N.

최소 제수 i가를 초과 하면 더 이상 제수 가 N없습니다. 그래서 우리는 우리가 경우보고가 성공했는지 확인 M==0 and N==1동등하거나, M+1==N==1또는 M+1==N<2언제부터, M+1==N상호 값이 (이 최적화를위한 FryAmTheEggman 덕분에) 양의 정수를 보장한다.

이 코드는 N대부분의 시스템에서 약 1000 의 스택 오버플로를 발생 시키지만 이것을 피하기 위해 Stackless Python 에서 실행할 수 있습니다 . 또한 지수 재귀 분기로 인해 매우 느립니다.


나는 당신이 사용할 수 있다고 생각합니다-~M==N<2
FryAmTheEggman

@FryAmTheEggman 나는 그것이 잘못된 긍정을 줄 것이라고 생각했지만 M과 에 대한 공동 제약으로 인해 실제로 작동합니다 N. 감사!
xnor

4

루비, 67

f=->n,m,s=2,r=0{m<2?1:s.upto(n**0.5){|d|n%d<1&&r+=f[n/d,m-1,d]}&&r}

재귀 적 정의에 실제로 합리적으로 효율적입니다. 작은 제곱 [d,q]인 n의 각 제수 쌍 에 d대해 결과를 합산합니다 f[q,m-1]. 까다로운 부분은 내부 호출에서 요소를 d보다 크거나 같은 요소로 제한하여 이중 계산을 끝내지 않는다는 것입니다.

1.9.3-p327 :002 > f[30,2]
 => 3 
1.9.3-p327 :003 > f[2310,4]
 => 10 
1.9.3-p327 :004 > f[15,4]
 => 0 
1.9.3-p327 :005 > f[9,2]
 => 1 


2

T-SQL 456 373

입력이 커질 때까지 이것이 깨질 것이라고 확신합니다.

여러 SET 대신 CONCAT 및 SELECTing으로 많은 문자를 저장하는 데 도움을 준 @MickyT에게 감사드립니다.

CREATE PROC Q(@N INT,@M INT)AS
DECLARE @ INT=2,@C VARCHAR(MAX)='SELECT COUNT(*)FROM # A1',@D VARCHAR(MAX)=' WHERE A1.A',@E VARCHAR(MAX)=''CREATE TABLE #(A INT)WHILE @<@N
BEGIN
INSERT INTO # VALUES(@)SET @+=1
END
SET @=1
WHILE @<@M
BEGIN
SELECT @+=1,@C+=CONCAT(',# A',@),@D+=CONCAT('*A',@,'.A'),@E+=CONCAT(' AND A',@-1,'.A<=A',@,'.A')END
SET @C+=CONCAT(@D,'=',@N,@E)EXEC(@C)

나는 이것을 공표하고 싶지만 그것을 테스트하는 간단한 방법을 찾을 수 없습니다. 어떤 아이디어? 작동한다는 타사의 확인도 좋습니다.
Geobits

2012 년에 실행하면 몇 가지 변환 오류가 발생합니다. 그들은이 제표로 표시 SET @C+=',# A'+@하고SET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
MickyT

또한 수정해야합니다 SET @C+=@D+'=@N'+@E+' SELECT @'. 은 @N당신이 실행할 때 따옴표가 범위를 벗어난 그것을 만드는 내부 @C. 또한 중복 계산을하게 될 것입니다
MickyT

이제 2012 년에 테스트했습니다. 제대로 작동합니다.
bmarks

2
지금 잘 작동합니다 :) 일부 캐릭터를 면도 할 수있는 몇 곳. 사용해보십시오 CONCAT당신의 문자열을 구축 할 수 있습니다. 그런 다음 CONVERTs를 떨어 뜨릴 수 있습니다 . SELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)당신의 WHILE루프 에서 시도 하십시오 . 합리적인 숫자를 절약해야합니다
MickyT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.