- NX1: Nếu n là 1 thì có 1 ước số.
- NX2: Nếu n là 2 thì có 2 ước số.
- NX3: Mọi số n lớn hơn 2 đều có ít nhất hai ước là 1 và n.
- NX4: Nếu a là ước của n thì n/a cũng là ước của n.
- NX5: Số sqrtn = phần nguyên của căn bậc hai của n là ước lớn nhất của n nếu có thể.
- NX6: Nếu n chia hết cho sqrtn thì lúc này theo NX4 có hai ước là sqrtn và sqrrtn/n =sqrtn. Tuy nhiên n chỉ nhận sqrtn là ước một lần.
int Count(int n)
{
if(n == 1) return 1;
if(n == 2) return 2;
int res = 2;
int sqrtn = (int)sqrt(n);
for(int i=2; i<= sqrtn; i++)
{
if(n%i==0)
res += 2;
}
if(sqrtn*sqrtn == n) res--;
return res;
}
Thuật toán trên có độ phức tạp O(sqrt(n)). Tuy nhiên thuật toán trên chưa đủ mạnh để giải quyết các bài toán thuộc dạng này. Ví dụ như:
http://codeforces.com/problemset/problem/236/B
Để giải bài toán trên chúng ta sử dụng công cụ tìm số ước mạnh hơn nữa. Bài sau tôi sẽ viết về vấn đề này.
Không có nhận xét nào:
Đăng nhận xét