# NGHĨ KĨ TRƯỚC KHI LÀM, CHỈ ĐỌC SOL KHI BÍ
---
## Ý tưởng
1. Ta dùng một [vector](https://blog.28tech.com.vn/stl-vector-trong-c) để lưu chỉnh hợp.
2. Lập một hàm backtrack gồm 3 tham số là biến $n$, $k$ và vector $v$.
3. Chạy một vòng lặp từ 1 tới n, tìm trong vector bằng hàm [find](https://cplusplus.com/reference/algorithm/find/) để tìm và kiểm tra xem $i$ đã ở trong vector chưa.
4. Khi vector đủ $k$ phần tử, trả ra kết quả.
### *một vài lưu ý:*
- hàm `find` sẽ trả ra kết quả là một **iterator** thể hiện vị trí của phần tử cần tìm, không phải là **số**.
- dấu $&$ trong dòng 4 của code mang nghĩa là tham chiếu (reference), hiểu đơn giản là nếu biến trong hàm thay đổi thì bên ngoài cũng thay đổi theo.
- có thể truy cập link [này](https://howkteam.vn/course/truyen-tham-chieu-cho-ham-passing-arguments-by-reference/bien-tham-chieu-trong-creference-variables-2790) để rõ hơn về reference.
- ~~bài [này](https://open.spotify.com/track/0tjncEeLWvpmFMaLzZ7dFb?si=2d2df7271f7d46f6) hay :3~~
---
## Code:
# NHẤN MẠNH LẠI, KHÔNG NÊN CHÉP CODE
```cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
void bt(vector<int> &v, int k, int n){
if(v.size() == k){
for(int i : v) cout << i << " ";
cout << '\n';
return;
}
for(int i = 1; i <= n; i++){
if(find(v.begin(), v.end(), i) == v.end()){ //nếu i không tồn tại trong vector, hàm sẽ trả ra kết quả là end() của v
v.push_back(i);
bt(v, k, n);
v.pop_back();
}
}
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, k; cin >> n >> k;
vector<int> v;
bt(v, k, n);
return 0;
}
```