题目描述
小易在学校中学习了关于字符串的理论, 于是他基于此完成了一个字典的项目。
小易的这个字典很奇特, 字典内的每个单词都包含n个’a’和m个’z’, 并且所有单词按照字典序排列。
小易现在希望你能帮他找出第k个单词是什么。
输入包括一行三个整数n, m, k(1 <= n, m <= 100, 1 <= k <= 109), 以空格分割。
输出第k个字典中的字符串,如果无解,输出-1。
我的思路
-
n个a,m个z,共有 C n + m m C_{n+m}^m Cn+mm种方法
-
如果第一个字母为’a’, c o u n t = C n − 1 + m m count = C_{n-1+m}^{m} count=Cn−1+mm,比较和k的关系
#include<iostream>
#include<algorithm>
#include <string>
using namespace std;
long factorial(long number)
{ if(number<=1)
return 1;
else
return number*factorial(number-1);
}
long combinator(int n,int m)
{ int temp;
if(n<m)
{ temp=n;
n=m;
m=temp;}
return factorial(n)/(factorial(m)*factorial(n-m));
}
int main()
{
int n,m; long k;
cin>>n>>m>>k;
if(k>combinator(n+m, m)){
cout<<-1<<endl;
return 0;
}
string ans;
while(k>1 && m>0 && n>0)
{
long tmp =combinator(n-1+m, m);
if(k>tmp){
ans += 'z';
k = k-tmp;
m--;
}
else
{
ans += 'a';
n--;
}
}
string sa(n, 'a'), sz(m, 'z');
ans =ans+sa+sz;
cout<<ans<<endl;
return 0;
}
浮点错误:您的程序运行时发生浮点错误,比如遇到了除以 0 的情况
case通过率为30.00%
= = 哪里错了嘞
#include<iostream>
#include <string>
using namespace std;
int main()
{
int n,m; long long k;
cin>>n>>m>>k;
string ans;
while (n && m) {
long long count = 1;
for (int i = 0; i < n - 1; i++) {//求组合数
count *= n - 1 + m - i;
count /= (i + 1);
if (count > k)break;
}
if (k <= count) {
ans+='a';
n--;
}
else {
ans+='z';
m--;
k -= count;
}
}
if (k != 1) {//
cout << -1;
return 0;
}
string sa(n, 'a'), sz(m, 'z');
ans =ans+sa+sz;
cout<<ans<<endl;
return 0;
}
运行时间:5ms
占用内存:504k