小易在学校中学习了关于字符串的理论, 于是他基于此完成了一个字典的项目。
小易的这个字典很奇特, 字典内的每个单词都包含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)