长沙理工大学第十二届ACM大赛-重现赛 K题

Number of ordered, unlabeled binary rooted trees with n nodes and k leaves

也是The number of Dyck paths of semilength n, having k-1 ddu's [here u = (1,1) and d = (1,-1)].

mod=1000000007


# https://oeis.org/A091894
# https://math.stackexchange.com/questions/2172676/number-of-ordered-unlabeled-binary-rooted-trees-with-n-nodes-and-k-leafs


# binomial取模
def binomial_mod(n, k, mod):
    if k > n:
        return 0
    if k == 0 or k == n:
        return 1
    
    # Initialize numerator and denominator
    num = den = 1
    
    # Compute n! / (k! * (n-k)!) % mod
    for i in range(k):
        num = num * (n - i) % mod
        den = den * (i + 1) % mod
    
    # Compute the modular inverse of denominator
    den_inv = pow(den, mod - 2, mod)
    
    return num * den_inv % mod

# 利用快速幂计算分数取模
def fraction_mod_inverse(a,b,mod):
    # a*(b**(mod-2))%mod
    return pow(b,mod-2,mod)*a%mod

  
# Number of ordered, unlabeled binary rooted trees with n nodes and k leaves 
# 也是The number of Dyck paths of semilength n, having k-1 ddu's [here u = (1,1) and d = (1,-1)].


while True:
    try:
        n,k=map(int,input().split())
        k=k-1
        if  n==0 and k==0:
            ans=1
        elif n==0:
            ans=0
        elif k<=(n)//2:
            numerator=pow(2, (n-2*k-1), mod)*binomial_mod(n-1, 2*k, mod)%mod*binomial_mod(2*k, k, mod)%mod
            denominator=k+1
            ans=fraction_mod_inverse(numerator, denominator, mod)
        else:
            ans=0
        print(ans)
    except:
        break

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务