给定
a
a
a 个 'a' 和
b
b
b 个 'b' ,求由这
a
+
b
a+b
a+b 个字符组成的字典序第
k
k
k 大字符串。
考虑当前还有
x
x
x 个 'a' ,
y
y
y 个 'b' ,尝试当前位安排 'a' ,
'a' ,则凑成的最大的字符串也比第
k
k
k 大的字典序小,所以应该安排 'b''a'此外,如果没有 'a' 了,那么说明后续都得安排 'b' 。
时间复杂度: O ( ( a + b ) × b ) O((a+b)\times b) O((a+b)×b)
#include
using namespace std;
typedef long long ll;
ll get_cnt(int n, int a) {
ll res = 1;
for (int i = 1, j = n; i <= a; ++i, --j) {
res = res * j / i;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int a, b;
ll k;
cin >> a >> b >> k;
int n = a + b;
string ans(n, 'b');
for (int i = 0; i < n && a > 0; ++i) {
ll cnt = get_cnt(a + b - 1, a - 1);
if (k > cnt) {
k -= cnt;
ans[i] = 'b';
b -= 1;
} else {
ans[i] = 'a';
a -= 1;
}
}
cout << ans << "\n";
return 0;
}