Nguồn đề bài: http://vn.spoj.com/problems/NKABD/
1. Đề bài NKABD spoj
Trong số học, số phong phú là các số mà tổng các ước số của số đó (không kể chính nó) lớn hơn số đó. Ví dụ, số 12 có tổng các ước số (không kể 12) là 1 + 2 + 3 + 4 + 6 = 16 > 12. Do đó 12 là một số phong phú.
Bạn hãy lập trình đếm xem có bao nhiêu số phong phú trong đoạn [L,R].
Dữ liệu
Gồm 2 số L, R (1 <= L <= R <= 105)
Kết quả
Gồm 1 số nguyên duy nhất là số số phong phú trong đoạn [L, R].
Chú ý
Có 50% số test có 1 <= L <= R <= 103
Ví dụ
Dữ liệu
1 50
Kết quả
9
Giải thích:
Từ 1 đến 50 có 9 số phong phú là:
12, 18, 20, 24, 30, 36, 40, 42, 48
=========================
Bài này kêu gì làm đó thôi 😀 chỉ có phần kiểm tra ước. các bạn chỉ cần tìm từ 2->sqrt(n) thôi. vì cái này liên quan đến toán và đã được chứng minh nên mình ko nhắc lại.
2. code tham khảo NKABD spoj (pascal)
program bt; const fi=''; fo=''; var f:text; a,b:longint; function check(n:longint):boolean; var i:longint; S:longint; begin s:=1; for i:=2 to trunc(sqrt(n)) do if n mod i = 0 then begin inc(s,i); if i<>n div i then inc(s,n div i); if s>n then exit(true); end; exit(s>n); end; procedure xuli; var i:longint; dem:longint; begin dem:=0; for i:=a to b do if check(i) then inc(dem); writeln(f,dem); end; begin assign(f,fi); reset(f); readln(f,a,b); close(f); assign(f,fo); rewrite(f); xuli; close(f); end.
BCPP spoj PTIT