* Ta biết rằng, số lần vòng lặp tối đa mà vòng for có thể chạy được trong vòng 1s là 10^7 vòng.
* Mà n <= 10^12 theo cách thông thường, ta sẽ duyệt qua các số từ 1 -> n, tức 10^12 vòng, dễ thấy nó chắc chắn sẽ quá thời gian.
-> Ta cần sử dụng thuật toán tối ưu, với độ phức tạp ít nhất là O(sqrt(n)), nó có tên là thuật toán duyệt căn
* Giải thích thuật toán (tìm hiểu qua 1 số nguồn trên mạng):
Giả sử: N = i * j , i <= j. Vậy i lớn nhất khi i = j, hay chính xác là sqrt(n). Vậy ta chỉ cần duyệt từ 1 -> sqrt(n), nếu i là ước của n hay n % i = = 0 thì ước còn chính là n/i (vì i * n/ i = n). Cần chú ý các trường hợp nếu n/i = i, vì lúc này cùng 1 số i được tính 2 lần, nên nếu n/i != i thì i và n/i là ước của n
$$\texttt{C++}$$
#include
using namespace std;
int main()
{
long long n, res = 0;
cin >> n;
for (long long i = 1; i * i <= n; i++) // i * i <= n <=> i <= sqrt(n) (vì max_i = sqrt(n))
{
if (n % i == 0)
{
res += i;
if (n / i != i)
{
res += n / i;
}
}
}
cout << res;
}