Tải bản đầy đủ (.doc) (52 trang)

(Sáng kiến kinh nghiệm) vận dụng thuật toán về số nguyên tố để giải các bài toán

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (265.98 KB, 52 trang )

ĐẶT VẤN ĐỀ
1. Lý do chọn đề tài
Số nguyên tố là một trong những vấn đề trung tâm của số học. Trong thực
tế, các thuật toán về số học được ứng dụng vào việc giải quyết rất nhiều bài toán.
Một trong những thuật tốn đó là thuật tốn về số nguyên tố. Đây là thuật toán
được sử dụng nhiều trong các kỳ thi học sinh giỏi Tin học. Do đó, việc giảng dạy
để các em nắm chắc về thuật toán cũng như việc vận dụng các thuật tốn đó để
giải các bài toán cụ thể là điều rất quan trọng, đó cũng là cơ sở để các em học tốt
phần tin học lập trình và đạt kết quả cao trong học tập cũng như trong các kỳ thi
HSG.
Với kinh nghiệm nhiều năm giảng dạy và tham gia bồi dưỡng học sinh giỏi
tôi viết sáng kiến kinh nghiệm với đề tài “Vận dụng thuật toán về số nguyên tố
để giải các bài toán”.
Nội dung của đề tài là kiến thức các thuật toán về số nguyên tố và việc vận
dụng các thuật tốn đó trong giải quyết các bài tốn.
Tơi hy vọng sáng kiến kinh nghiệm sẽ là tài liệu tham khảo tốt cho các giáo
viên và các em học sinh trong giảng dạy và bồi dưỡng học sinh giỏi. Rất mong
được sự góp ý từ các đồng nghiệp.
2. Cấu trúc nội dung
I. Các thuật toán về số nguyên tố
1.

Thuật toán kiểm tra tính ngun tố

2.

Thuật tốn Sàng ngun tố Eratosthenes

3.

Phân tích một số ra thừa số nguyên tố.



II. Bài tập vận dụng
Dạng 1: Kiểm tra tính nguyên tố
Dạng 2: Sử dụng thuật tốn sàng ngun tố
Dạng 3: Phân tích thành các số ngun tố
3. Mục đích nghiên cứu.
Trong q trình nghiên cứu và giảng dạy, tôi nhận thấy việc vận dụng các
thuật toán về số nguyên tố vào việc giải một số bài tốn rất hiệu quả. Vì vậy, tơi
viết đề tài này với mục đích:
Thứ nhất, trao đổi cùng với các đồng nghiệp về việc vận dụng các thuật
về số nguyên tố vào việc giải một số bài toán.
-

1


- Thứ hai, là tài liệu cho giáo viên phục vụ giảng dạy, bồi dưỡng học sinh
giỏi.
4. Phương pháp nghiên cứu.
Kinh nghiệm bản thân, thảo luận, sưu tầm tài liệu, thử nghiệm thực tế, rút
kinh nghiệm từ các tiết dạy trên lớp.
5. Giới hạn phạm vi nghiên cứu của đề tài
Đề tài chủ yếu nghiên cứu vận dụng các thuật tốn được ứng dụng rộng rãi
đó là tìm kiếm tuần tự và tìm kiếm nhị phân, sắp xếp lựa chọn (Selection Sort)
và sắp xếp nhanh (Quick Sort).
Đề tài có khả năng áp dụng rộng rãi vào giảng dạy, bồi dưỡng học sinh giỏi
Tin học cho giáo viên và học sinh THCS, THPT trên địa bàn toàn tỉnh Nghệ An.

2



NỘI DUNG
Việc nắm vững các thuật toán về số nguyên tố là điều rất quan trọng, đó là
cơ sở để các em học sinh vận dụng và giải quyết các bài tốn cụ thể. Sau đây, tơi
xin trình bày kiến thức các thuật toán về số nguyên tố được ứng dụng rộng rãi và
hệ thống các bài tập mà tôi đã tìm hiểu và vận dụng có hiệu quả trong q trình
giảng dạy.
I. CÁC THUẬT TỐN VỀ SỐ NGUN TỐ
1.1. Thuật tốn kiểm tra tính ngun tố
Ta có thuật tốn kiểm tra tính nguyên tố của một số n, chạy trong thời
1/2
gian O(n ):
Function isprime (n:integer):boolean;
Begin
if n<=1 then exit(false);
for i:=2 to trunc(sqrt(n)) do
if x mod i=0 then exit(false);
exit(true);
End;
1.2. Thuật toán Sàng nguyên tố Eratosthenes
Để tìm các số nguyên tố nhỏ hơn hoặc bằng số tự nhiên N bằng sàng
Eratosthenes, ta làm như sau:
 Bước 1: Tạo 1 danh sách các số tự nhiên liên tiếp từ 2 đến n: (2, 3,
4,..., n).
 Bước 2: Giả sử tất cả các số trong danh sách đều là số nguyên tố.
Trong đó, p = 2 là số nguyên tố đầu tiên.
 Bước 3: Tất cả các bội số của p: 2p, 3p, 4p,... sẽ bị đánh dấu vì
khơng phải là số ngun tố.
 Bước 4: Tìm các số cịn lại trong danh sách mà chưa bị đánh dấu và
phải lớn hơn p. Nếu khơng cịn số nào, dừng tìm kiếm. Ngược lại, gán cho p

giá trị bằng số nguyên tố tiếp theo và quay lại bước 3.
Khi giải thuật kết thúc, tất các số chưa bị đánh dấu trong danh sách là các
số nguyên tố cần tìm.

3


procedure eratosthenes(n:integer);
begin
fillchar(p, sizeof(p), true);
for i:=2 to n do
if (p[i]) then
begin
j:=i*i;
while (j<=n) do
begin
p[j]:=false;
inc(j,i);
end;
end;
end;
Ta có mảng P, P[i]=true (i>1) nếu I là số ngun tố và ngược lại.
Thuật tốn này chỉ có độ phức tạp là O(n) thế nên ta có thể hồn tồn
8
thực hiện với n=10 .
1.3 Phân tích một số ra thừa số nguyên tố.
procedure

phantich(n);


Begin
i:=2; t:=0;
While (i*i<=n) do
If (n mod i=0) then
Begin
x:=0;
While (n mod i=0) do
Begin
n:=n div i;
inc(x);
end;
4


inc(t);
coso[t]:=i; somu[t]:=x;
inc(i);
end;

5


If (n>1) then
Begin
inc(t);
coso[t]:=n; somu[t]:=x;
end;
end;
Thông tin được trả về trong mảng coso[i] và somu[i] lần lượt là cơ số và số
mũ của thừa số thứ I trong phép phân tích của n ra thừa số nguyên tố. Trong

trường hợp xấu nhất, với n là số ngun tố thì thuật tốn chạy trong thời gian
1/2
là O(n ).

6


II. BÀI TẬP ÁP DỤNG
Dạng 1: Kiểm tra tính nguyên tố
Bài 1. Viết chương trình nhập vào từ bàn phím số nguyên N (N>10), in ra
màn hình các số nguyên tố trong khoảng từ 1 đến N.
Hướng dẫn:
Nhận xét: Học sinh sẽ áp dụng thuật tốn kiểm tra tính ngun tố của một
số để giải quyết bài toán. Ta chỉ cần dùng thêm một vòng lặp chạy từ 2 đến N
đặt ngồi vịng lặp kiểm tra số ngun tố.
Chương trình:
Var

i,k,n:integer;
nt:boolean;

begin
write('N = ');readln(n);
For k:=1 to N do
begin
nt:=true;
if K<=1 then nt:=false else
for i:=2 to trunc(sqrt(K)) do if k mod i=0 then
begin
nt:=false;break;

end;
if nt then write(k:5);
end;
end.
Bài 2. Dãy số
Cho dãy số nguyên a1, a2, …, an . với ai 109,n105
1.
2.

Tìm số nguyên tố lớn nhất của dãy
Số nào xuất hiện nhiều nhất trong dãy.

Dữ liệu:
Đầu vào cho bởi tệp: primemax.inp
- Dòng đầu tiên là số n
- Dòng thứ hai là n số nguyên mỗi số cách nhau bởi một dấu cách.
7


Đầu ra cho bởi tệp: primemax.out
- Dòng thứ nhất là số ngun tố lớn nhất của dãy, nếu khơng có số ngun
tố thì in ra 0.
- Dịng thứ hai là số xuất hiện nhiều nhất trong dãy, nếu có nhiều số có số
lần xuất hiện bằng nhau thì in ra số đầu tiên.
Ví dụ:
PRIMEMAX.INP

PRIMEMAX.OUT

16


0

00001111-1-1-1 -14444

0

4

5737

11873 5737 9269 7956

11873

Trong đó:
- Có 70% số test ứng với 70% số điểm của bài có
- Có 30% số test ứng với 30% số điểm của bài có

n  10

3

n  10

5

Hướng dẫn:
-


Kiểm tra tính nguyên tố của một số, sau đó áp dụng thuật tốn tìm
Max của một dãy số.
Ta duyệt từ đầu đến cuối mảng, tìm số lần của số xuất hiện nhiều nhất
trong mảng.

Chương trình:
const fi='PRIMEMAX.INP';

fo='PRIMEMAX.OUT';
var a:array[1..100000] of longint; d:array[100000000..100000000] of integer;
n,i,dmax,ntmax,res:longint;
f:text;
function kt(x:longint):boolean;
var i:longint;
begin
if x<2 then exit(false);
for i:=2 to trunc(sqrt(x)) do
if x mod i=0 then exit(false);
8


exit(true);
end;
begin
assign(f,fi); reset(f);
ntmax:=0;
readln(f,n);
for i:=1 to n do
begin
read(f,a[i]);

if kt(a[i]) then
if a[i]>ntmax then ntmax:=a[i];
inc(d[a[i]]);
end;
assign(f,fo); rewrite(f);
for i:=1 to n do
if d[a[i]]>dmax then
begin
dmax:=d[a[i]];
res:=a[i];
end;
writeln(f,ntmax);
writeln(f,res);
close(f);
end.
Bài 3. BEAUTY
Một số được gọi là đẹp nếu tổng bình phương các chữ số của nó (trong
dạng biểu diễn thập phân) là một số nguyên tố.
Ví dụ, 12 là một số đẹp vì 12 + 22 = 5 là số nguyên tố.
Các số đẹp được đánh số theo thứ tự tăng dần của giá trị, bắt đầu từ 1 trở
đi.
Yêu cầu: Cho số nguyên N (1 ≤ N ≤ 106). Hãy tìm số đẹp thứ N.
9


Dữ liệu: Vào từ file BEAUTY.INP
Gồm nhiều tests, mỗi test cho trên một dòng chứa một số nguyên N.
Kết quả: Ghi ra file BEAUTY.OUT
Mỗi test đưa ra trên một dòng là kết quả số đẹp tìm được tương ứng của
mỗi test từ file dữ liệu vào.

Ví dụ:
BEAUTY.INP

BEAUTY.OUT

1

11

6

23

Hướng dẫn:
Bài này chỉ u cầu tính tổng các chữ số sau đó kiểm tra xem tổng đó có
phải là số ngun tố khơng.
Chương trình:
const fi='beauty.inp';
fo='beauty.out';
var

f:text;
a,b:array[1..2000000] of longint;
c:array[1..810] of boolean;
i,j,n,s,max:longint;

procedure

docf;


begin
assign(f,fi);
reset(f);
n:=0;
while not eof(f) do
begin
inc(n);
readln(f,a[n]);
end;
close(f);
end;
10


function
var

ktr1:boolean;

j:longint;

begin
ktr1:=false;
for j:=2 to trunc(sqrt(i)) do
if i mod j=0 then exit;
ktr1:=true;
end;
function
var


ktr(i:longint):boolean;

j:longint;

begin
s:=0;
while i<>0 do
begin
s:=s+sqr(i mod 10);
i:=i div 10;
end;
if c[s] then ktr:=true else ktr:=false;
end;
begin
docf;
max:=0;
j:=0;
for i:=2 to 810 do if ktr1 then c[i]:=true;
for i:=1 to n do if maxj:=1;
i:=11;
b[1]:=11;
while j<=max do
begin
inc(i);
11


if ktr(i) then
begin

inc(j);
b[j]:=i;
end;
end;
assign(f,fo);
rewrite(f);
for i:=1 to n do writeln(f,b[a[i]]);
close(f);
end.
Bài 4. Nguyên tố cùng nhau
Juggernaut được cơ giáo Disruptor dạy tốn, cơ giáo định nghĩa một
hàm f(x) như sau:
Với t là số lượng các số tự nhiên k (1 <= k <= x) thỏa mãn nguyên tố cùng
nhau với x, nếu t là nguyên tố thì f(x) = 1, ngược lại f(x) = 0.
Disruptor cho Juggernaut một số nguyên dương x, yêu cầu anh cho biết
giá trị của hàm f(x), nếu trả lời sai thì Jug sẽ bị cơ trả về nhà, Jug không muốn
về nhà, các bạn hãy giúp Jug giải bài tốn này.
Input
Dịng đầu tiên chứa số bộ test T (T <= 10).
Mỗi test gồm một dòng chứa số x (1 <= x <= 10^5).
Output
In ra kết quả mỗi test trên một dịng là giá trị của hàm f(x).
Ví dụ:
Input:
2
2
3
Output:
0
1


12


Giải thích khái niệm
-

Nguyên tố cùng nhau của 2 số a và b là UCLN của a và b bằng 1

Hướng dẫn:
Xây dựng hàm UCLN, Kiểm tra số nguyên tố rồi thực hiện duyệt bình
thường.
-

ĐPT: O(n*T)
Chương trình:
const fi='';
type data=longint;
var
T,N,i,j,dem,k:data;
snt:boolean;
f:text;
function ktsnt(x:data):data;
var

i:data;

begin
if x=1 then exit(0);
for i:=2 to trunc(sqrt(x)) do

if x mod i=0 then
exit(0);
exit(1);
end;
function UCLN(a,b:data):data;
var
r:data;
begin
while a mod b<>0 do
begin
r:=a mod b;
a:=b;
13


b:=r;
end;
exit(b);
end;
begin
assign(f,fi); reset(f);
readln(f,T);
for i:=1 to T do
begin
readln(f,k);
dem:=0;
for j:=1 to k do
if ucln(k,j)=1 then
inc(dem);
writeln(ktsnt(dem));

end;
close(f);
end.
Bài 5. Số nguyên tố
Số nguyên tố là số chỉ chia hết cho 1 và chính nó. Trong một buổi dã ngoại
của trường, bất ngờ TMB bị thầy giáo đố một câu như sau: “Một số có dạng
p^q là lũy thừa cao của một số nguyên tố khi và chỉ khi p là một số nguyên tố và
q>1. Thầy sẽ cho em một số N bất kỳ và em hãy cho biết đó có phải là lũy thừa
cao của một số nguyên tố hay không?”. Không phải lúc nào cũng mang theo
máy tính bên mình, đây là lúc TMB cần bạn.
Yêu cầu: Cho số N, hãy giúp TMB trả lời câu đố của thầy giáo, nếu N là lũy
thừa cao của một số nguyên tố thì in ra 2 số p và q tương ứng, nếu khơng thì
ghi 0.
Giới hạn:
n <= 10^18
Input:
 1 dòng duy nhất chứa n
14


Output:
 1 dịng duy nhất là kết quả
Ví dụ:
Input

Output

27

33


Input

Output

10

0
Thuật tốn:
- Viết hàm kiểm tra một số là nguyên tố
- Hàm lấy căn
- Hàm tính lũy thừa
Chương trình:
const fi='';
vc=high(int64);
du=1000000000000000000;
type data=longint;
data1=int64;
var
N:data1;
f:text;
function KTSNT(n:data1):boolean;
var
i:data;
begin
for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then
exit(false);
exit(true);
15



end;
function tinhcan(a:int64; b:data1):int64;
begin
tinhcan:=round(exp(ln(a)/b));
end;
function amuk(a:int64; k:data):int64;
var

i:data;
res:int64;

begin
res:=1;
for i:=1 to k do
begin
res:=(res*a) mod du;
end;
exit(res);
end;
procedure xuli;
var

i,j:data;
so:data1;

begin
for i:=2 to 60 do
begin

so:=tinhcan(n,i);
if (amuk(so,i)=n) and ktsnt(so) then
begin
writeln(so,' ',i);
exit;
end;
end;
16


writeln(0);
end;
begin
assign(f,fi); reset(f);
readln(f,n);
close(f);
xuli;
end.
Bài 6. Tìm nghiệm
Xét một phương trình có dạng sau:
x + y+ z =K
trong đó K là một số ngun dương.
Phương trình này có thể có vơ số nghiệm. Tuy nhiên, ở đây người ta chỉ
quan tâm đến các nghiệm (x,y,z) mà trong đó các số x,y,z đều là các số nguyên
tố.
Nhắc lại: số tự nhiên p được gọi là số nguyên tố nếu p>1 và p chỉ chia hết
cho 1 và chính nó.
Bài tốn: Với số K cho trước (K < 5000), hãy tìm tất cả các bộ số nguyên tố
x,y,z (x  y  z) là nghiệm của phương trình trên hoặc cho biết khơng có nghiệm
thoả mãn yêu cầu bài toán.

Dữ liệu vào cho trong file văn bản EQUA.INP trong đó chứa duy nhất số K
Kết quả ghi ra file văn bản EQUA.OUT chứa N + 1 dịng (N là số nghiệm tìm
được), trong đó:

Dịng thứ i trong N dòng đầu tiên chứa 3 số nguyên cho
biết bộ nghiệm thứ i tìm được.


Dịng thứ N + 1 chứa 3 số 0 cho biết điểm kết thúc file output.



Các số trên cùng một dòng cách nhau bởi khoảng trắng.

Ví dụ:
EQUA.INP
4

EQUA.OUT
000
17


EQUA.INP

EQUA.OUT

7

223

000

Hướng dẫn:
Ta kiểm tra các số nguyên tố từ 1 đến 5000 (giá trị lớn nhất của K) rồi lưu
vào một mảng:
Sau đó dùng hai vịng lặp qua mảng này để duyệt qua x và y. Mảng đánh
dấu nt dùng để kiểm tra nhanh xem z=K-x-y có phải là số ngun tố khơng:
Chương trình:
const finp='equa.inp';
fout='equa.out';
MAXK=5010;
function nguyento(n: longint): boolean;
var i: longint;
begin
nguyento:=false;
for i:=2 to trunc(sqrt(n)) do if n mod i = 0 then exit;
nguyento:=true;
end;
var n, k, i, j, z: longint;
nt: array[2..MAXK] of boolean;
p: array[1..MAXK] of longint;
begin
assign(input, finp);
reset(input);
assign(output, fout);
rewrite(output);
fillchar(nt,sizeof(nt),0);
for i:=2 to MAXK do

if (nguyento(i)) then begin

18


inc(n);
p[n]:=i;
nt[i]:=true;
end;
readln(k);
for i:=1 to n do
for j:=i to n do
begin
z:=k-p[i]-p[j];
if (nt[z]) and (p[j]writeln(p[i], ' ',p[j],' ', z);
end;
writeln('0 0 0');
close(input);
close(output);
end.
Bài 7. Tìm mật khẩu
Việc bảo vệ máy tính của mình để hạn chế người khác thâm nhập vào là
một vấn đề đặt ra cho mọi nguời sử dụng máy tính. Để tăng tính an tồn trong
lưu trữ, một nguời đã quyết định dấu mật khẩu truy cập máy tính của mình vào
một xâu T với một quy ước sao cho khi cần anh ta có thể lấy lại đuợc mật khẩu
từ T như sau.
Là một người yêu thích số học anh ta thường chọn mật khẩu P là một số
nguyên tố và đem dấu vào một xâu ký tự T sao cho P chính là số ngun tố có
giá trị lớn nhất trong số các số nguyên tố tạo được từ các xâu con của T (xâu
con của một xâu ký tự T là một chuỗi liên tiếp các ký tự trong T).
Ví dụ: xâu T=”Test1234#password5426” chứa mật khẩu là 23 vì T chứa các

xâu con ứng với các số nguyên tố 2,3,23 và 5.
Yêu cầu: Cho một xâu ký tự T chiều dài khơng q 250 ký tự. Tìm mật khẩu
5
P đã dấu trong xâu T biết P có giá trị nhỏ hơn 10 . Dữ liệu cho đảm bảo T
chứa ít nhất 1 số nguyên tố.
Dữ liệu: Vào từ file văn bản PASSWORD.INP gồm 1 dòng duy nhất là xâu T.
Kết quả: Ghi ra file văn bản PASSWORD.OUT chứa số P tìm được.
19


Ví dụ:
PASSWORD.INP
Test1234#password5426
PASSWORD.OUT
23
Hướng dẫn:
Ta duyệt qua tất cả các xâu con của xâu T mà có thể tạo thành một số và
kiểm tra số đó có phải số nguyên tố hay không.
Để duyệt qua các xâu con, ta duyệt qua vị trí đầu:
for i:=1 to length(t) do {i là vị trí đầu của xâu con} Với mỗi
vị trí đầu i, ta duyệt qua vị trí cuối của xâu con: j:=i;
while (j<=length(t)) do
begin
...
inc(j);
end;
Có hai điều kiện để ta dừng q trình duyệt một xâu con với vị trí đầu là i:
- Gặp một ký tự không phải chữ số:
if (t[j]<'1') or (t[j]>'9') then break;
-


Số tạo thành lớn hơn hoặc bằng 105, vì đề bài đã nêu rõ P có giá trị
nhỏ hơn 105:
if v>=100000 then break;

Khi đọc được một chữ số mới, ta nhân số hiện tại với 10 rồi cộng thêm
chữ số mới:
v:=v*10+ord(t[j])-ord('0');
Nếu số thu được là số nguyên tố và lớn hơn kết quả tốt nhất tìm được thì
cập nhật kết quả:
if nguyento(v) then
if (v>kq) then kq:=v;
Chương trình:
const finp='password.inp';
20


fout='password.out';
function nguyento(n: longint): boolean;
var i: longint;
begin
nguyento:=false;
if n<2 then exit;
for i:=2 to trunc(sqrt(n)) do
if (n mod i = 0) then
exit;
nguyento:=true;
end;
var t: string;
i, kq, v, j: longint;

begin
assign(input,finp);
reset(input);
assign(output,fout);
rewrite(output);
readln(t);
kq:=-1;
for i:=1 to length(t) do
begin
v:=0;
j:=i;
while (j<=length(t)) do
begin
if (t[j]<'1') or (t[j]>'9') then break;
v:=v*10+ord(t[j])-ord('0');
21


if v>=100000 then break;
writeln(v);
if nguyento(v) then
if (v>kq) then kq:=v;
inc(j);
end;
end;
writeln(kq);
close(input);
close(output);
end.


22


Dạng 2: Sử dụng thuật toán sàng nguyên tố
Bài 1. HSPC14J-Sàng ( />Sàng của Eratosthenes là thuật toán nổi tiếng để tìm tất cả các số nguyên
tố nhỏ hơn N. Thuật toán như sau:
1.

Ghi ra tất cả các số nguyên giữa 2 và N.

2.

Tìm số nhỏ nhất chưa bị gạch và gọi nó là P (P là số nguyên tố).

3.

Gạch bỏ P và tất cả các bội số của nó mà chưa bị gạch.

4.

Nếu còn số chưa bị gạch bỏ, chuyển sang bước 2.

Viết một chương trình, cho N và K, tìm số nguyên thứ K bị gạch.
Input
Gồm nhiều bộ test, mỗi bộ test nằm trên một dòng gồm các số nguyên N
và K (2 ≤ K < N ≤ 1000).
Output
Với mỗi test, in ra trên một dòng số thứ K bị gạch bỏ.
Example
Input:

73
15 12
10 7
Output:
6
7
9
Hướng dẫn:
Ta sử dụng thuật toán sàng nguyên tố và các bước thực hiện như đề bài ,
thêm một biến đếm để biết thứ tự số nguyên bị gạch bỏ.
Chương trình:
const fi = 'bai1.inp';
fo = 'bai1.out';
var f,g : text;
p : array[0..1001] of boolean;
23


procedure xuly;
var n,kk,j,k,i:longint;
Begin
fillchar(p,sizeof(p),true); k:=0;
readln(f,n,kk);
for i:=2 to n do
if (p[i]) then
for j:=1 to (n div i) do
Begin
if (p[i*j]) then inc(k);
p[j*i]:=false;
If (k=kk) then begin writeln(g,i*j); exit;

end; end;
end;
Begin
assign(f,fi); assign(g,fo);
reset(f); rewrite(g);
While not eof(f) do
Begin
xuly;
end;
close(g);
end.
Bài 2. Khóa số
Vườn quốc gia Xuân Sơn, tỉnh Phú Thọ nổi
tiếng với vẻ đẹp hoang sơ tự nhiên, có hệ sinh
thái phong phú và đa dạng. Du khách khi tới đây
có thể tận mắt chiêm ngưỡng khu rừng chị trỉ
đẹp nhất miền bắc cùng một số loài thực vật số
lượng lớn như cây rau sắng, dẻ, mộc lan…
Ngoài
24


sức hấp dẫn của hệ động thực vật phong phú, Xn Sơn cịn có nhiều cảnh quan
thiên nhiên kỳ thú thu hút khách du lịch như núi Voi, núi Ten và núi Cẩn. Cùng
với các con suối như suối Lấp, suối Thang; với nhiều thác nước có độ cao trên
50m. Màu thác bạc hoà quyện với màu xanh của rừng già làm cho phong cảnh
nơi đây vừa hùng vĩ vừa thơ mộng.
Tại đây, các nhà khảo cổ học đã phát hiện ra một số kho báu bí mậtcủa
được các vua Hùng xây dựng rất kiên cố và không thể phá bỏ. Họ cho rằng
trong đó có thể là những khối tài sản về lịch sử và văn hóa rất có giá trị và họ

tìm cách mở cánh cửa của những kho báu đó.
Trên cửa mỗi kho báu có một bảng gồm 2 hàng, hàng 1 đã
N
6

ghi sẵn số nguyên dương N (≤10 ), hàng 2 chứa 2 khoá số K1 và
K2 như hình bên.

K1

K2

Trong khi khảo sát, các nhà khảo cổ đã phát hiện một phiến đá có ghi cách
để mở khố như sau: cửa có bảng chứa số N sẽ tương ứng với K1 và K2 là:
-

Điều chỉnh khoá số K1 về số bằng số lượng ước nguyên tố của N;

Điều chỉnh khoá số K2 về số bằng tổng các ước nguyên tố của N thì cánh
cửa sẽ tự động mở ra và nhà khảo cổ có thể vào bên trong kho báu một cách dễ
dàng.
-

Ví dụ: Ở nhà kho trên cửa ghi số N=12, có các ước của N là 1, 2, 3, 4, 6,
12 chỉ có 2 ước nguyên tố là 2 và 3 nên K1=2 và K2=5.
N;

Dữ liệu: vào từ filevăn bản PASS.INPchứa duy nhất một số nguyên dương
Kết quả: Ghi ra filevăn bản PASS.OUT hai số ngun K1 và K2.
Ví dụ:

PASS.INP
12

PASS.OUT
25

Ràng buộc:




Có 30% số các test ứng với 30% số điểm của bài có ≤ 1000;

Có 40% số test khác ứng với 40% số điểm của bài có ≤ 104;
Có 30% số test cịn lại ứng với 30% số điểm của bài có ≤ 106.

Hướng dẫn:
Bài này yêu cầu chỉ đơn giản là xây dựng sàng lọc ra các số nguyên tố nhỏ
hơn hoặc bằng N. Đếm số lượng các số nguyên tố và tính tổng các số nguyên tố
đó.
25


×