#include <bits/stdc++.h>
using namespace std;
//////////////////////////////////////////////////////////////
// 📌 BÀI 1: Tập con có tổng < K
//////////////////////////////////////////////////////////////
void bai1() {
int N, K; cin >> N >> K;
vector<int> A(N);
for (int &x : A) cin >> x;
vector<pair<int, vector<int>>> res;
for (int mask = 1; mask < (1 << N); ++mask) {
int sum = 0;
vector<int> idx;
for (int i = 0; i < N; ++i)
if (mask >> i & 1) sum += A[i], idx.push_back(i + 1);
if (sum < K) res.push_back({sum, idx});
}
if (res.empty()) {
cout << -1 << '\n';
return;
}
sort(res.begin(), res.end());
for (auto &[s, v] : res) {
for (int i : v) cout << i << ' ';
cout << "\nSum = " << s << '\n';
}
}
//////////////////////////////////////////////////////////////
// 📌 BÀI 2: Hoán vị có độ chênh lệch > 0
//////////////////////////////////////////////////////////////
void bai2() {
int N; cin >> N;
vector<int> a(N);
iota(a.begin(), a.end(), 1);
do {
int diff = 0;
for (int i = 0; i < N - 1; ++i)
diff += a[i] - a[i + 1];
if (diff != 0) {
for (int x : a) cout << x << ' ';
cout << '\n';
}
} while (next_permutation(a.begin(), a.end()));
}
//////////////////////////////////////////////////////////////
// 📌 BÀI 3: Tìm độ dài chuỗi con nhỏ nhất chứa đủ ký tự khác nhau
//////////////////////////////////////////////////////////////
int solveBai3(string s) {
set<char> all(s.begin(), s.end());
map<char, int> count;
int need = all.size(), have = 0;
int res = s.size(), left = 0;
for (int right = 0; right < s.size(); ++right) {
if (++count[s[right]] == 1) have++;
while (have == need) {
res = min(res, right - left + 1);
if (--count[s[left++]] == 0) have--;
}
}
return res;
}
void bai3() {
int T; cin >> T;
cin.ignore();
while (T--) {
string s;
getline(cin, s);
cout << solveBai3(s) << '\n';
}
}
//////////////////////////////////////////////////////////////
// 📌 BÀI 4: Đếm số lượng ký tự 'B' trong k vị trí đầu tiên của F[n]
//////////////////////////////////////////////////////////////
const int MAXN = 46;
long long len[MAXN];
int countB(int n, long long k) {
if (n == 0) return 0;
if (n == 1) return (k >= 1);
if (k <= len[n - 1])
return countB(n - 1, k);
else
return countB(n - 1, len[n - 1]) + countB(n - 2, k - len[n - 1]);
}
void bai4() {
len[0] = 1; len[1] = 1;
for (int i = 2; i < MAXN; ++i)
len[i] = len[i - 1] + len[i - 2];
int T; cin >> T;
while (T--) {
int n;
long long k;
cin >> n >> k;
cout << countB(n, k) << '\n';
}
}
//////////////////////////////////////////////////////////////
// 🔘 MENU CHỌN BÀI
//////////////////////////////////////////////////////////////
int main() {
cout << "Nhap so bai muon chay:\n";
cout << "1. Tap con co tong < K\n";
cout << "2. Hoan vi co do chenh lech > 0\n";
cout << "3. Chuoi con nho nhat chua du ky tu\n";
cout << "4. Dem so ky tu 'B' trong k vi tri dau F[n]\n";
cout << "Nhap lua chon (1-4): ";
int choice;
cin >> choice;
switch (choice) {
case 1: bai1(); break;
case 2: bai2(); break;
case 3: bai3(); break;
case 4: bai4(); break;
default: cout << "Lua chon khong hop le!\n";
}
return 0;
}