[ABC202D] aab aba baa

85 篇文章 0 订阅

提示:创作不易,点个关注

题目描述

$ 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 からなる文字列を辞書順に並べると、aabbabababbabaabbababbaa となります。 よって、$ 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 1KS

样例 #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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>