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 zzaaC 解法, 执行用时: 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); }