Em đang gặp vấn đề về một bài tập nhỏ, cụ thể là tạo một hàm để đếm các cặp số nguyên dương từ một tập hợp các số nguyên dương không lớn hơn số nguyên N sao cho tích của chúng tạo ra một số chính phương.
Em đã làm và kết quả đúng nhưng chưa được tối ưu và đã thử tìm nhiều cách nhưng không hiệu quả.
Em mong mọi người có thể giúp em. Code của em ở đây
Input : Một dòng chứa số nguyên dương N (1 <= N <= 100.000)
Output : Số cặp tạo thành số chính phương. Ví dụ với N = 4 thì có 6 cặp số với mỗi số nhỏ với mỗi số nhỏ hơn 4 nhưng tích là số chính phương đó là (1, 1), (1, 4), (4, 1), (2, 2), (3, 3), (4, 4).
#include <iostream>
#include <math.h>
using namespace std;
bool CheckSquareNum(int n){
int sqr = sqrt(n);
return (sqr * sqr == n);
}
int Chinhphuong(int n) {
int count = 0;
for (int i = 1; i <= n; i++){
for (int j = i + 1; j <= n; j++) {
if (CheckSquareNum(i * j))
count++;
}
}
return count * 2 + n;
}
int main() {
int n;
cin >> n;
cout << Chinhphuong(n);
return 0;
}