提示:创作不易,点个关注
题目描述
$ A $ 個の a と $ B $ 個の b からなる長さ $ A\ +\ B $ の文字列のうち、辞書順で $ K $ 番目のものを求めてください。
输入格式
入力は以下の形式で標準入力から与えられる。
$ A $ $ B $ $ K $
输出格式
答えを出力せよ。
制約
- $ 1\ \leq\ A,\ B\ \leq\ 30 $
- $ A $ 個の
aと $ B $ 個のbからなる長さ $ A\ +\ B $ の文字列の総数を $ S $ 個とおいたとき、$ 1\ \leq\ K\ \leq\ S $ - 入力は全て整数である。
Sample Explanation 1
$ 2 $ 個の a と $ 2 $ 個の b からなる文字列を辞書順に並べると、aabb、abab、abba、baab、baba、bbaa となります。 よって、$ 4 $ 番目である baab を出力します。
Sample Explanation 2
$ K $ の値は $ 32 $ bit 整数に収まらないことがあります。
题面翻译
给定 A , B , K A,B,K A,B,K 三个正整数。
求以 A A A 个 a a a , B B B 个 b b b 组成的长度为 A + B A\ +\ B A + B 字符串的若干种可能中,按词典序的第 K K K 种可能。
【数据范围】
令 S S S 所有的可能数目。
$ 1 ≤ A, B ≤ 30 $
1 ≤ K ≤ S 1 ≤ K ≤ S 1≤K≤S
样例 #1
样例输入 #1
2 2 4
样例输出 #1
baab
样例 #2
样例输入 #2
30 30 118264581564861424
样例输出 #2
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
提示
AC Code:
#include<bits/stdc++.h>
using namespace std;
long long Fast(long long x, long long y){
long long i, sum = 1;
for (i = 1; i <= y; i++){
sum = sum * (x - i + 1) / i;
}
return sum;
}
int main(){
long long i, a, b, c, n;
cin >> a >> b >> c;
n = a + b;
for (i = 1; i <= n; i++){
if (a == 0){
cout << "b";
}
else if (b == 0){
cout << "a";
}
else if (Fast(a + b - 1, a - 1) < c){
c = c - Fast(a + b - 1, a - 1);
cout << "b";
b = b - 1;
}
else{
cout << "a";
a = a - 1;
}
}
return 0;
}

6412

被折叠的 条评论
为什么被折叠?



