列表

详情


WY67. 小易的字典

描述

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

小易的这个字典很奇特, 字典内的每个单词都包含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

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2019-07-09

#include<stdio.h>
int main()
{
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    int index = 0;
    char ch[200];
    while(n && m)
    {
        long long count = 1;
        for(int i=1; i<n; i++)
        {
            count *= n+m-i;
            count /= i;
            if(count > k) break;
        }
        if(k <= count)
        {
            ch[index++] = 'a';
            n--;
        }
        else
        {
            ch[index++] = 'z';
            m--;
            k -= count;
        }
    }
    if(k != 1)
    {
        printf("-1");
        return 0;
    }
    while(n--)
    {
        ch[index++] = 'a';
    }
    while(m--)
    {
        ch[index++] = 'z';
    }
    ch[index] = 0;
    printf("%s",ch);
}

C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2018-10-31

#include <stdio.h>
#include <stdlib.h>

long long Cnm(int n,int m){
	if (m < 0) return 1;
	long long r = 1;
	int i = n-m+1, j = m;
	while (i <= n || j > 1) {
		if (j>1 && 0 == r % j) r /= j--;
		else r *= i++;
	}
	return r;
}

int main(){
	int n,m,k;
	scanf("%d%d%d",&n,&m,&k);
	char *str = (char *)malloc(sizeof(char)*(m + n + 1));
	int pos = 0;
	while (m && n) {
		long long count = 1;
		//1.假设该位为'a'则count=Cnm(m+n-1,n-1),
		for (int i = 1; i < n; i++) {
			count *= m + n - i;
			count /= i;
			if (k < count) break;
		}
		if (k > count) {
			str[pos++] = 'z';
			k -= count;
			m--;
		} else {
			str[pos++] = 'a';
			n--;
		}
	}
	if (k != 1) {
		printf("-1");
		return 0;
	}
	while (n-- > 0) str[pos++] = 'a';
	while (m-- > 0) str[pos++] = 'z';
	str[pos] = 0;
	printf("%s", str);
}

上一题