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

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 (1.4 MB, 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 toán đó là thuật toá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
toá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 toán đó trong giải quyết các bài toá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 nguyên tố
2. Thuật toán Sàng nguyên 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 toán sàng nguyên tố
Dạng 3: Phân tích thành các số nguyên tố
3. Mục đích nghiên cứu.
Trong quá 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 toá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 toá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 toá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 quá trình
giảng dạy.
I. CÁC THUẬT TOÁN VỀ SỐ NGUYÊN TỐ
1.1. Thuật toán kiểm tra tính nguyên tố
Ta có thuật toán kiểm tra tính nguyên tố của một số n, chạy trong thời

gian O(n1/2):
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ố nguyên 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ố nguyên tố và ngược lại.
Thuật toán này chỉ có độ phức tạp là O(n) thế nên ta có thể hoàn toàn
thực hiện với n=108.
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ố nguyên tố thì thuật toán chạy trong thời gian
là O(n1/2).


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 toán kiểm tra tính nguyên 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 ngoài vòng lặp kiểm tra số nguyên 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ố nguyên tố lớn nhất của dãy, nếu không có số nguyên
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

0 0 0 0 1 1 1 1 -1 -1 -1 -1 4 4 4 4


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ó n  103
- Có 30% số test ứng với 30% số điểm của bài có n  105
Hướng dẫn:
-

Kiểm tra tính nguyên tố của một số, sau đó áp dụng thuật toá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ỉ yêu cầu tính tổng các chữ số sau đó kiểm tra xem tổng đó có
phải là số nguyên 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 toá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 toá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 toá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ố nguyên 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 toá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

EQUA.OUT

4


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ố nguyên 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 toà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ố nguyên 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 quá 250 ký tự. Tìm mật khẩu
P đã dấu trong xâu T biết P có giá trị nhỏ hơn 105. 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 quá 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ú, Xuân 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 đã

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

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ở khoá 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.
Dữ liệu: vào từ filevăn bản PASS.INPchứa duy nhất một số nguyên dương
N;
Kết quả: Ghi ra filevăn bản PASS.OUT hai số nguyên K1 và K2.
Ví dụ:
PASS.INP
12

PASS.OUT
2 5

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


×