https://vjudge.net/problem/CodeForces-1328B
题目大意:一个长度为 n n n的字符串,两个字符为 b b b,其余的字符均为 a a a,那么满足题意的不同的字符串有 n ∗ ( n − 1 ) / 2 n*(n-1)/2 n∗(n−1)/2种,现在给定 k k k,求字典序第 k k k大的字符串。
思路:字典序越小肯定 b b b越靠后,比如最小的肯定是 a … b b a…bb a…bb,下一步把第一个 b b b前移一个位置,再下一步肯定就是把后面那个 b b b往前移动,举个例子,假设 n = 4 n=4 n=4时,有 6 6 6个不同的字符串,它们从小到大排序为: a a b b 、 a b a b 、 a b b a 、 b a a b 、 b a b a 、 b b a a aabb、abab、abba、baab、baba、bbaa aabb、abab、abba、baab、baba、bbaa。规律还是很容易看出来的。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
int idx1,idx2;
for(int i=1;i<=n;i++)
{
if(k<=i)
{
idx1=i;
break;
}
k-=i;
}
idx1=n-idx1;
idx2=n+1-k;
for(int i=1;i<=n;i++)
{
if(i==idx1||i==idx2)
putchar('b');
else
putchar('a');
}
printf("\n");
}
return 0;
}