B. K-th Beautiful String
time limit per test :1 seconds memory limit per test :256 megabytes
input :standard input output :standard output
For the given integer n (n>2) let's write down all the strings of length n which contain n−2 letters 'a' and two letters 'b' in lexicographical (alphabetical) order.
Recall that the string s of length n is lexicographically less than string t of length n, if there exists such i (1≤i≤n), that si<ti, and for any j (1≤j<i) sj=tj. The lexicographic comparison of strings is implemented by the operator < in modern programming languages.
For example, if n=5 the strings are (the order does matter):
1.aaabb
2.aabab
3.aabba
4.abaab
5.ababa
6.abbaa
7.baaab
8.baaba
9.babaa
10.bbaaa
It is easy to show that such a list of strings will contain exactly n⋅(n−1) / 2 strings.
You are given n (n>2) and k (1≤k≤n⋅(n−1) / 2). Print the k-th string from the list.
Input
The input contains one or more test cases.
The first line contains one integer t (1≤t≤) — the number of test cases in the test. Then t test cases follow.
Each test case is written on the the separate line containing two integers n and k (3≤n≤,1≤k≤min(2⋅,n⋅(n−1) / 2).
The sum of values n over all test cases in the test doesn't exceed .
Output
For each test case print the k-th string from the list of all described above strings of length n. Strings in the list are sorted lexicographically (alphabetically).
Example
input
7
5 1
5 2
5 8
5 10
3 1
3 2
20 100
output
aaabb
aabab
baaba
bbaaa
abb
bab
aaaaabaaaaabaaaaaaaa
题目大意
求由n - 2个字母‘a'与2个字母’b'组成的长度为n的字符串中字典序第k小的字符串
思路
确定两个b的位置即可
观察题目所给样例,第一个b在倒二位置的字符串有1个,倒三2个,倒四3个,倒五4个,所以第k个字符串我们需要找到一个pos,使得,那么第一个b的位置就是n - pos,第二个b的位置就是
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 1e5 + 10;
int main()
{
int t;
cin >> t;
while (t --){
ll n, k;
cin >> n >> k;
ll x = sqrt(k);
while (x * (x + 1) / 2 < k) x ++;//其实没必要这样找位置,直接O(n)暴力找,每次减n - i - 1就行,使用这种方式要开ll,不然会死循环
ll pos1 = n - x;
ll y = k - (x - 1) * x / 2;
ll pos2 = n - y + 1;
for (int i= 1; i <= n; ++i){
if (i == pos1 || i == pos2) cout << 'b';
else cout << 'a';
}
cout << endl;
}
return 0;
}