首页 > 试题广场 >

小易的字典

[编程题]小易的字典
  • 热度指数:16067 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

小易在学校中学习了关于字符串的理论, 于是他基于此完成了一个字典的项目。

小易的这个字典很奇特, 字典内的每个单词都包含n个'a'和m个'z', 并且所有单词按照字典序排列。

小易现在希望你能帮他找出第k个单词是什么。


输入描述:

输入包括一行三个整数n, m, k(1 <= n, m <= 100, 1 <= k <= 109), 以空格分割。



输出描述:
输出第k个字典中的字符串,如果无解,输出-1。
示例1

输入

2 2 6

输出

zzaa

说明

字典中的字符串依次为aazz azaz azza zaaz zaza zzaa
n, m, k = map(int, input().split(" "))
def cul(n,m):
    a = 1
    b = 1
    c = 1
    for i in range(1,n+m+1):
        a *= i

    for i in range(1,n+1):
        b *= i

    for i in range(1,m+1):
        c *= i

    return a/b/c
ans = ""
if cul(n,m) < k:
    print(-1)
else:
    while n>0 and m>0:
        K = cul(n-1, m)
        if K < k:
            ans += "z"
            m -= 1
            k -= K
        else:
            ans += "a"
            n -= 1
    ans += "a"*n+"z"*m
    print(ans)

cul函数计算 表示, 对有n个"a"和m个"z"进行组合的最大个数.

首先判断是否存在解, 如果k大于组合的个数则不存在解.

K = cul(n-1, m)代表以"a"开头的全部排列的个数. 如果k大于K则一定是以"z"开头. 否则以"a"开头. 以"z"开头的话, 就略过了所有以"a"开头的字串, 所以k = k-K. 把已经分配的"a"或者"z"减去, 进入下一次循环.

发表于 2019-07-16 15:01:37 回复(0)
"""
n个'a'和m个'z',排列组合有C(n,m)种结果
利用以上性质找到字典序第k个单词
"""
import sys


def C(n, m):
    ret = 1
    for i in range(n + 1, n + m + 1):
        ret *= i
    for i in range(1, m + 1):
        ret //= i
    return ret


if __name__ == "__main__":
    # sys.stdin = open('input.txt', 'r')
    n, m, k = list(map(int, input().strip().split()))
    ans = ""
    if C(n, m) < k:
        ans += '-1'
    else:
        while n and m:
            temp = C(n - 1, m)
            if temp < k:
                k -= temp
                ans += 'z'
                m -= 1
            else:
                ans += 'a'
                n -= 1
        ans += 'a' * n
        ans += 'z' * m
    print(ans)

发表于 2019-07-03 20:14:39 回复(0)
n,m,k=list(map(int,input().split()))
nn=n;mm=m
l=[]
jc=[1]
for i in range(m+n):
    jc.append((i+1)*jc[i])
if k>jc[n+m]/(jc[m]*jc[n]):
    print('-1')
else:
    for i in range(1,mm+nn+1):
        an=jc[m+n-1]/(jc[n-1]*jc[m])
        if k<=an:
            l.append('a')
            n-=1
        else:
            l.append('z')
            m-=1
            k=k-an
    l=''.join(l)
    print(l)

发表于 2018-11-05 00:25:01 回复(0)