공을 통에 넣는 방법의 수를 세십시오.


9

이 작업에는 홀수 개의 흰색 공과 같은 수의 검은 공이 제공됩니다. 과제는 공을 쓰레기통에 넣는 모든 방법을 세어 각 쓰레기통에 각 색상의 홀수를 갖도록하는 것입니다.

예를 들어, 3 개의 흰색 공이 있다고 가정합니다. 다른 방법은 다음과 같습니다.

(wwwbbb)
(wb)(wb)(wb)

두 가지 다른 가능성을 위해

우리가 5 개의 흰 공을 가지고 있다면 다른 방법은 다음과 같습니다.

(wwwwwbbbbb)
(wwwbbb)(wb)(wb)
(wwwb)(wbbb)(wb)
(wb)(wb)(wb)(wb)(wb)

원하는 방식으로 단일 정수인 입력을 취할 수 있습니다. 출력은 단일 정수입니다.

11 개의 흰색 공이 코드를 완성 할 수 있도록 코드는 충분히 빠르지 않아야합니다.

원하는 언어 나 라이브러리를 사용할 수 있습니다.


우리의 결과물이 다른 방식의 숫자 일 수 있습니까? 즉, 단일 숫자는 출력입니까?
orlp

5
나는이에서한다고 가정 math.stackexchange.com/questions/2736933/... 당신은 그것을 @Lembik 인용한다
qwr

3
속도 기준을 취하거나 더 구체적으로 만들어야한다고 생각합니다. "빠른 속도"는 너무 모호합니다.
dylnan

1
PPCG 사용자는 슈퍼 바이트를 사용하여 1 바이트 이상을 계산하는 것보다 11 대를 계산하는 데 돈을 쓸 정도로 미쳤다는 것을 알고 있습니까? 그렇다면 왜 돈을 낭비합니까? :)
user202729

1
(비고 : 복잡한 수식 을 사용하여 P 함수를 효율적으로 계산할 수 있습니다. 적절한 수식을 사용하여이 함수를 계산할 수도 있습니다.)
user202729

답변:


5

Pari / GP, 81 바이트

p=polcoeff;f(n)=p(p(prod(i=1,n,prod(j=1,n,1+(valuation(i/j,2)==0)*x^i*y^j)),n),n)

효율성을 높이 려면 다음 1+과 같이 바꾸십시오 1+O(x^(n+1))+O(y^(n+1))+(첫 번째 O용어만으로도 많은 도움이됩니다).

온라인으로 사용해보십시오! (필요하지 않은 parens 쌍이 있고 p=약어 가없는 초기 86 바이트 버전 )

이전 버전, 90 바이트

f(n)=polcoeff(polcoeff(taylor(1/prod(i=0,n,prod(j=0,n,1-x^(2*i+1)*y^(2*j+1))),x,n+1),n),n)

컴퓨팅 f(11)에는 더 큰 스택 크기가 필요하며 오류 메시지는이를 늘리는 방법을 알려줍니다. 에 대한 두 n번째 인수로 나타나는 두 가지를 바꾸는 것이 더 효율적이지만 덜 골치 prod입니다 (n-1)/2.


나를 위해 13까지 작동합니다!

나는 그것이 버전을 사용하는 것 같아 (n-1)/2?
Christian Sievers

예, 좋은 지적입니다.

관심이 없다면 f (500)을 계산할 수 있다고 생각하십니까?

2
이는 컴퓨팅 F (500) = 214621724504756565823588442604868476223315183681404 몇 분 소요
크리스찬에게 승인 Sievers

7

파이썬 3, 108 바이트

C=lambda l,r,o=():((l,r)>=o)*l*r%2+sum(C(l-x,r-y,(x,y))for x in range(1,l,2)for y in range(1,r,2)if(x,y)>=o)

모든 세트를 재귀 적으로 열거하므로 항상 세트를 순서대로 생성하여 복제되지 않도록하십시오. 을 사용하여 메모 할 때는 상당히 빠르지 C = functoools.lru_cache(None)(C)만, 반드시 필요한 것은 아닙니다 n = 11.

C(num_white, num_black)결과를 얻으려면 전화 하십시오. 첫 커플 n:

1: 1
3: 2
5: 4
7: 12
9: 32
11: 85
13: 217
15: 539
17: 1316
19: 3146
21: 7374

결과를 생성하려면 다음을 수행하십시오.

def odd_parts(l, r, o=()):
    if l % 2 == r % 2 == 1 and (l, r) >= o:
        yield [(l, r)]

    for nl in range(1, l, 2):
        for nr in range(1, r, 2):
            if (nl, nr) < o: continue
            for t in odd_parts(l - nl, r - nr, (nl, nr)):
                yield [(nl, nr)] + t

예 : (7, 7) :

[(7, 7)]
[(1, 1), (1, 1), (5, 5)]
[(1, 1), (1, 1), (1, 1), (1, 1), (3, 3)]
[(1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1)]
[(1, 1), (1, 1), (1, 1), (1, 3), (3, 1)]
[(1, 1), (1, 3), (5, 3)]
[(1, 1), (1, 5), (5, 1)]
[(1, 1), (3, 1), (3, 5)]
[(1, 1), (3, 3), (3, 3)]
[(1, 3), (1, 3), (5, 1)]
[(1, 3), (3, 1), (3, 3)]
[(1, 5), (3, 1), (3, 1)]

정말 좋습니다.

2

파이썬 3 , 180 172 바이트

def f(n):
 r=range;N=n+1;a=[N*[0]for _ in r(N)];R=r(1,N,2);a[0][0]=1
 for i in R:
  for j in R:
   for k in r(N-i):
    for l in r(N-j):a[k+i][l+j]+=a[k][l]
 return a[n][n]

온라인으로 사용해보십시오!

생성 기능의 간단한 구현. 길지만 (약간) 효율적입니다. O (n 4 ) 시간, O (n 2 ) 메모리.

결과 배열 a에는 최대 크기의 모든 결과가 포함 n되지만 a[n][n]반환 만됩니다 .


귀하의 코드는 관심없는 n에 대해 무엇을 계산합니까? a [4] [4]에서와 같이.

이것은 지금까지 가장 빠른 솔루션입니다!

2
@Lembik a [4] [4] = 4 개의 흰색 공과 4 개의 검은 공을 통에 넣는 방법의 수, 각 상자에는 홀수의 흰색 공과 홀수의 검은 공이 있습니다. 정의에서와 같이 정확하게.
user202729

1

파이썬 2 ,168 181 바이트

from itertools import*
r,p=range,product
def f(n):
 a,R=eval(`[[0]*n]*n`),r(1,n,2);a[0][0]=1
 for i,j in p(R,R):
  for k,l in p(r(n-i),r(n-j)):a[k+i][l+j]+=a[k][l]
 return a[-1][-1]

온라인으로 사용해보십시오!


입니다 코드 조각 (가정이 n입력을 포함) 당신이 중 하나를 추가해야 def f(n):하거나 n=input()(이 함수 / 전체 프로그램 RESP 만들 수 있습니다.)
user202729

그리고 ... 이것은 Python 2입니다. 두 개의 공백 대신 탭을 사용할 수 있습니다. 바이트를 저장합니다. 는 a할 수있다 eval(`[[0]*n]*n`)(여기서 `의 약자 repr).
user202729
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.