编程题
思路
可以用动态规划的思想解决这样的题目,把一个大的问题拆分为两个小问题来解决。这里只有两个不一样的字母。那么字典中的字符串肯定是a开头的和z开头的。并且我们已知有多少个a和多少个z,就能求出他们有多少种排列组合(设为x)。那么这个适合会出现两种情况,如果k大于x,那么输出-1,如果k小于x,那么就看剩下的两种情况,1. 如果第一个字母是a的话,那么以a为首字母的字符串的排列组合是由n-1个a和m个z组成,那么我们只需要比较k和count(n-1,m)组合数的大小,如果小于这个组合数,那么就代表,是以a开头的字符串。2
如果大于,那么就代表是以z开头的字符串,那么原本k的问题,就编程了,k-count(n-1,m)的问题。
链接:https://www.nowcoder.com/questionTerminal/12b1b8ef17e1441f86f322b250bff4c0
来源:牛客网
import math
n, m, k =list(map(int,input().split()))
def C(n,m): #组合公式
return math.factorial(n+m)/(math.factorial(n)*math.factorial(m))
r = []
def solve(n,m,k):
if n ==0:
for i in range(m):
r.append('z')
return
if m ==0:
for i in range(n):
r.append('a')
return
if k > C(n-1,m): #以a开头可能的字符串为C(n-1,m)种,均排在以z开头前,
r.append('z')
solve(n,m-1,k-C(n-1,m)) #以z开头,问题转为剩余字串中第k-C(n-1,m)个
else:
r.append('a')
solve(n-1,m,k)
if k> C(n,m):
print(-1)
else :
solve(n,m,k)
print(''.join(r))