小易在学校中学习了关于字符串的理论, 于是他基于此完成了一个字典的项目。
小易的这个字典很奇特, 字典内的每个单词都包含n个'a'和m个'z', 并且所有单词按照字典序排列。
小易现在希望你能帮他找出第k个单词是什么。
小易在学校中学习了关于字符串的理论, 于是他基于此完成了一个字典的项目。
小易的这个字典很奇特, 字典内的每个单词都包含n个'a'和m个'z', 并且所有单词按照字典序排列。
小易现在希望你能帮他找出第k个单词是什么。
输入包括一行三个整数n, m, k(1 <= n, m <= 100, 1 <= k <= 109), 以空格分割。
输出第k个字典中的字符串,如果无解,输出-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"减去, 进入下一次循环.
""" 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)
n,m,k=list(map(int,input().split()))nn=n;mm=ml=[]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-=1else:l.append('z')m-=1k=k-anl=''.join(l)print(l)