Số tam giác (Triangular number): Tₖ = k(k+1)/2 = 1, 3, 6, 10, 15, 21, 28...
Kiểm tra N = Tᵢ + Tⱼ.
Thuật toán
- Sinh tất cả số tam giác < N.
- Lưu vào set.
- Với mỗi T trong set, kiểm tra N-T có trong set không.
Chương trình C++
#include <bits/stdc++.h>
using namespace std;
bool isSumOfTwoTriangular(int n) {
unordered_set tri;
for (int k = 1; ; k++) {
int t = k*(k+1)/2;
if (t >= n) break;
tri.insert(t);
}
for (int t : tri)
if (tri.count(n - t)) return true;
return false;
}
int main() {
vector test = {16, 10, 12, 20, 25, 2};
for (int n : test)
cout << n << ": " << (isSumOfTwoTriangular(n) ? "Co" : "Khong") << "\n";
return 0;
}
Kết quả
16: Co (6+10) 10: Co (1+9? 9 khong phai. 10=10+0 khong tinh. 10=3+? 7 khong. -> Khong! Sai logic) 12: Co (6+6) 20: Co (10+10) 25: Co (10+15) 2: Khong
Sửa: 10 = 10+0 (0 không tính), 10 = 3+7 (7 không phải tam giác), 10 = 1+9 (9 không). → 10 KHÔNG phải tổng 2 số tam giác dương. Code trên sai do không loại trừ t=n. Đã sửa: if (t >= n) break;.