瑞瑞最近迷上了字符串,因此决定出一个字符串的题。
给定两个正整数 N、K,考虑所有由 N - 2 个 a 和 2 个 b 组成的字符串,要求输出其中字典序第 K 小的。
例如当 N = 5 时,共有如下 10 种组成方式:
aaabb
aabab
aabba
abaab
ababa
abbaa
baaab
baaba
babaa
bbaaa
Input
多组数据,第一行给定 T,表示数据组数。(1 ≤ T ≤ 1e4)
对于每组数据,给出两个正整数 N、K。(3 ≤ N ≤ 1e5, 1 ≤ K ≤ min(2e9, N * (N-1) / 2 ))
N 的总和不会超过 1e5。
Output
对于每组数据,输出长度为 N 的字典序第 K 小的字符串。
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
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 100000 + 5;
int sum[maxn],a[maxn];
char s[maxn];
void init(){
for(int i = 2; i <= 100000; i ++){
a[i] = a[i - 1] + 1;
sum[i] = sum[i - 1] + a[i];
}
}
int main(){
int t,n,k;
scanf("%d",&t);
init();
while(t--){
scanf("%d%d",&n,&k);
int i,j;
for(i = 2; i <= n; i ++){
if(sum[i] >= k) break;
}
j = i;
k -= sum[j - 1];
for(int i = 1; i <= n; i ++) s[i] = 'a';
s[n + 1] = '\0';
s[n - j + 1]='b';
s[n - k + 1]='b';
printf("%s\n",s + 1);
}
return 0;
}