计算将球放入垃圾箱的方式数


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 '18

1
您知道PPCG用户非常疯狂,他们宁愿花钱在使用超级计算机上计算11而不是花更多的字节吗?那为什么要浪费他们的钱呢?:)
user202729 '18

1
(注:可以使用复杂的公式有效地计算P函数。也可以使用适当的公式来计算该函数。)
user202729 '18

Answers:


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仅第一个术语已经很有用)。

在线尝试!(早期的86字节版本,带有一对不需要的括号,并且没有p=缩写)

旧版本,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)需要更大的堆栈大小,错误消息将告诉您如何增加它。这是更有效(但不golfy),以代替两个n显示为第二个参数prod(n-1)/2


为我工作多达13个!

我想那是与使用的版本(n-1)/2
Christian Sievers

是的,很好。

出于兴趣,您认为可以计算f(500)吗?

2
计算f(500)= 214621724504756565823588442604868476223315183183681404
Christian Sievers,

7

Python 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

Python 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的代码将计算什么?如在[4] [4]中。

这也是迄今为止最快的解决方案!

2
@Lembik a [4] [4] =将4个白球和4个黑球放入垃圾箱的方法数量,每个垃圾箱中有奇数个白球和奇数个黑球。完全按照定义。
user202729 '18

1

Python 2168 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()(使其成为功能/完整程序)
user202729

并且...这是Python 2,您可以使用制表符而不是两个空格。保存一个字节。该aeval(`[[0]*n]*n`)(其中`代表repr)。
user202729 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.