Tải bản đầy đủ (.docx) (38 trang)

Đề và đáp án chi tiết thi học sinh giỏi môn tin học tỉnh thanh hóa từ năm 2017 2018 2019

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 (209.24 KB, 38 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO
THANH HOÁ

KỲ THI HỌC SINH GIỎI CẤP TỈNH
Năm học: 2017-2018

ĐỀ CHÍNH THỨC

Mơn thi: Tin học - Lớp 11 THPT
Thời gian: 180 phút (không kể thời gian giao đề)
Ngày thi: 09/03/2018
Đề này có 05 câu, gồm 02 trang.

Số báo danh
…………………….

Tổng quan bài thi:
Tên bài
File chương trình File dữ liệu vào
File kết quả
Bài 1 Hệ đếm
BAI1.*
BAI1.INP
BAI1.OUT
Bài 2 Tìm số nguyên tố
BAI2.*
BAI2.INP
BAI2.OUT
Bài 3 Taxi
BAI3.*
BAI3.INP


BAI3.OUT
Bài 4 Hamming
BAI4.*
BAI4.INP
BAI4.OUT
Bài 5 Số lớn nhất
BAI5.*
BAI5.INP
BAI5.OUT
Dữ liệu vào là đúng đắn, không cần phải kiểm tra. Trong các file dữ liệu vào, nếu dữ liệu trên
cùng một dịng thì được cách nhau bởi ít nhất 1 dấu cách. Dấu (*) trong tên file chương trình
biểu thị đi file tùy thuộc vào NNLT sử dụng ('pas' đối với NNLT PASCAL, ‘c’ đối với NNLT
C,...).
Bài 1 (5 điểm):Hệ đếm
Lần đầu tiên tiếp xúc với các vấn đề cơ sở Tin học, Mạnh ngỡ ngàng và thú vị khi được
làm quen với hệ đếm cơ số 2 (Hệ đếm nhị phân). Mạnh nghĩ ra một xâu kí tự chỉ bao gồm các
kí tự ‘0’ và ‘1’ biểu diễn một số tự nhiên N trong hệ đếm cơ số 2 và đố Hải tìm biểu diễn của N
trong hệ đếm cơ số 10 (Hệ đếm thập phân).
Ví dụ: Mạnh nghĩ ra xâu ‘00010101’ là biểu diễn của số tự nhiên 15 trong hệ đếm cơ số 2.
Yêu cầu: Hãy giúp Hải chuyển xâu kí tự biểu diễn số tự nhiên N trong hệ đếm cơ số 2 thành
xâu biểu diễn N trong hệ đếm cơ số 10.
Dữ liệu vào: Từ tệp văn bản BAI1.INP gồm một dòng duy nhất chứa xâu S có độ dài khơng
q 32 ký tự.
Dữ liệu ra: Ghi ra tệp văn bản BAI1.OUT xâu biểu diễn của N trong hệ đếm cơ số 10.
Ví dụ:
BAI1.INP
10101110
Bài 2 (5 điểm): Tìm số nguyên tố

BAI1.OUT

174

- Tìm tất cả các số P lớn hơn M và nhỏ hơn N thỏa mãn các điều kiện sau:
+ Là số nguyên tố.
+ Tổng các chữ số của P phải chia hết cho k.
Dữ liệu vào: Từ tệp văn bản BAI2.INP: Gồm 3 số M, N, k (1 ≤ M,N,k ≤ 106) (các số cách
nhau ít nhất một dấu cách).
Dữ liệu ra: Ghi ra tệp văn bản BAI2.OUT gồm duy nhất 1 số là số lượng các số thỏa mãn yêu
cầu đầu bài.

1


Ví dụ:
BAI2.INP
2 35 2
Bài 3 (4 Điểm): Taxi

BAI2.OUT
6

BAI2.INP
1 10 11

BAI2.OUT
0

Trong dịp nghỉ hè các bạn học sinh lớp 12 dự định tổ chức dã ngoại đến biển Sầm Sơn và
sẽ đi bằng taxi. Các bạn được chia thành n nhóm, nhóm thứ i gồm S i bạn (1 ≤ Si ≤ 4) và mỗi
chiếc taxi chở tối đa 4 hành khách. Vậy lớp 12 cần thuê ít nhất bao nhiêu chiếc taxi để chở các

nhóm đi, với điều kiện là các bạn trong nhóm phải ngồi chung taxi (một taxi có thể chở một
nhóm trở lên).
Dữ liệu vào: Từ tệp văn bản BAI3.INP gồm:
- Dòng đầu chứa số nguyên n (1 ≤ n ≤ 105) (số lượng các nhóm học sinh)

2


- Dòng số 2 chứa dãy số nguyên S1, S2, ..., Sn (1 ≤ Si ≤ 4). Các số nguyên cách nhau bởi dấu
cách với Si là số học sinh trong nhóm thứ i.
Dữ liệu ra: Ghi ra tệp văn bản BAI3.OUT là 1 số nguyên duy nhất là số lượng tối thiểu xe
taxi cần thiết để chở tất cả học sinh đến nơi.
Ví dụ:
BAI3.INP
5

BAI3.OUT
4

12433
Bài 4 (3 điểm): Hamming
Dãy số nguyên dương tăng dần, trong đó ước nguyên tố của mỗi số không quá 5 được
gọi là dãy Hamming.
Như vậy, 10 = 2×5 sẽ là một số trong dãy Hamming, cịn 26 = 2×13 khơng thuộc dãy
Hamming.
Phần đầu của dãy Hamming là 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, . . .
Yêu cầu: Cho số nguyên x (1 ≤ x ≤ 109). Hãy xác định số thứ tự của x trong dãy Hamming.
Dữ liệu vào: Từ tệp văn bản BAI4.INP:
- Dòng đầu tiên chứa số nguyên t – số lượng tests (1 ≤ t ≤ 105),
- Các dòng tiếp theo mỗi dòng chứa một số nguyên x.

Dữ liệu ra: Ghi ra tệp văn bản BAI4.OUT: kết quả mỗi test đưa ra trên một dòng dưới dạng số
nguyên hoặc thông báo (-1) nếu không tồn tại số đó trong dãy Hamming.
Ví dụ:
BAI4.INP

BAI4.OUT

11

1

1

2

2

6

6

-1

7

7

8

8


9

9

10

-1

11

10

12

-1

13

-1

14
Bài 5 (3 điểm): Số lớn nhất


Cho 2 số nguyên dương X=X1X2…Xn và Y= Y1Y2…Ym (M,N≤200). Hãy tìm số Z=Z1Z2…
Zk lớn nhất (Z nhận được từ X và Y bằng cách xoá đi một số chữ số).
Ví dụ: X= 12345

Y= 435012


Thì Z=45 (nhận được từ X bằng cách xoá đi X1,X2,X3; nhận được từ Y bằng cách xoá đi Y2 ,
Y4 , Y 5 , Y6 )
Dữ liệu vào: Từ tệp văn bản BAI5.INP gồm:
- Dòng thứ nhất là X.
- Dòng thứ hai là Y.
Dữ liệu ra: Ghi ra tệp văn bản BAI5.OUT 1 số Z là kết quả của bài tốn.
Ví dụ:
BAI5.INP
42572

BAI5.OUT
25

BAI5.INP
12345

BAI5.OUT
123

39258
4351023
Trong đó: có 1/6 số test chỉ tồn tại số Z mà các chữ số của nó trong X và Y là liên tiếp nhau.
- Hết


SỞ GIÁO DỤC VÀ ĐÀO TẠO
THANH HOÁ

KỲ THI HỌC SINH GIỎI CẤP TỈNH

Năm học: 2018-2019

ĐỀ CHÍNH THỨC

Mơn thi: Tin học - Lớp 11 THPT
Thời gian: 180 phút (không kể thời gian giao đề)
Ngày thi: 21/03/2019
Đề này có 05 câu, gồm 02 trang.

Số báo danh
…………………….

Tổng quan bài thi:
Tên bài
File chương trình File dữ liệu vào
File kết quả
Bài 1 Tổng số hoàn hảo
BAI1.*
BAI1.INP
BAI1.OUT
Bài 2 Cặp số nguyên
BAI2.*
BAI2.INP
BAI2.OUT
Bài 3 Đếm xâu con
BAI3.*
BAI3.INP
BAI3.OUT
Bài 4 Giai thừa
BAI4.*

BAI4.INP
BAI4.OUT
Bài 5 Dãy con
BAI5.*
BAI5.INP
BAI5.OUT
Dữ liệu vào là đúng đắn, không cần phải kiểm tra. Trong các file dữ liệu vào/ra, nếu dữ liệu
trên cùng một dịng thì được cách nhau bởi ít nhất 1 dấu cách. Dấu (*) trong tên file chương
trình biểu thị đi file tùy thuộc vào NNLT sử dụng ('pas' đối với NNLT PASCAL, ‘c’ đối với
NNLT C,...).

Bài 1 (6 điểm): Tổng số hoàn hảo.
Số hoàn hảo là số có tổng các ước số trừ nó bằng chính nó.

u cầu: Tính tổng các số hồn hảo nhỏ hơn hoặc bằng N.
Dữ liệu vào: Đọc từ tệp BAI1.INP - số nguyên N (1≤ N ≤ 105).
Dữ liệu ra: Ghi ra tệp BAI1.OUT kết quả tìm được.
Ví dụ:

BAI1.INP
30

BAI1.OUT
34

(có 2 số hoàn hảo nhỏ hơn hoặc bằng 30 là 6 và 28; 6+28=34)
Bài 2 (5 điểm): Cặp số nguyên.
Bài tốn tìm ước chung lớn nhất và tìm bội chung nhỏ nhất là hai bài tốn cơ bản.
Nhưng hơm nay thầy giáo cho cả lớp biết L là ước chung lớn nhất và G là bội chung
nhỏ nhất của 2 số nguyên dương.

Yêu cầu: Tìm 2 số nguyên dương a và b có tổng nhỏ nhất sao cho ước chung lớn nhất
của a và b bằng L, bội chung nhỏ nhất của a và b bằng G.
Dữ liệu vào: Đọc từ tệp BAI2.INP gồm 2 số L, G (1≤ LDữ liệu ra: Ghi ra tệp BAI2.OUT là 2 số a và b tìm được (a≤b)
Ví dụ:
BAI2.INP
4 60

BAI2.OUT
12 20


Bài 3 (4 điểm): Đếm xâu con.
Cho xâu S bao gồm các chữ cái ‘A’..’Z’ và các chữ số ‘0’..’9’.
Yêu cầu: Đếm số xâu con trong xâu S có số lượng chữ cái nhiều hơn số lượng chữ số
(xâu con của xâu S là một dãy kí tự liên tiếp trong xâu S).
Dữ liệu vào: Đọc từ tệp BAI3.INP gồm xâu S có độ dài ≤104
Dữ liệu ra: Ghi ra tệp BAI3.OUT kết quả tìm được.
Ví dụ:

BAI3.INP

BAI3.OUT

AC54C

6

Bài 4 (3 điểm): Giai thừa.
Cho trước số tự nhiên N.


Yêu cầu: Tìm số tự nhiên K nhỏ nhất sao cho K! có đúng N chữ số.
Dữ liệu vào: Đọc từ tệp BAI4.INP gồm một dòng chứa số tự nhiên N (1≤ N≤ 104).
Dữ liệu ra: Ghi ra tệp BAI4.OUT kết quả tìm được. Nếu khơng có số K nào thoả mãn
u cầu đề ra thì ghi -1.
Ví dụ:
BAI4.INP
3

BAI4.OUT
5

Bài 5 (2 điểm): Dãy con.
Cho dãy số tự nhiên A gồm N phần tử a 1, a2, …., aN và số nguyên dương K. Dãy con a i,
ai+1, …, aj (1≤i≤j≤N) là dãy được tạo từ các phần tử liên tiếp của dãy A, bắt đầu từ phần tử
thứ i và kết thúc ở phần tử thứ j.

Yêu cầu: Tìm số lượng dãy con của dãy A có ít nhất K phần tử bằng nhau.
Dữ liệu vào: Đọc từ tệp BAI5.INP
• Dịng đầu tiên chứa 2 số ngun dương N, K (1≤ K≤N≤4x105).
• Dịng thứ 2 chứa N số tự nhiên a1, a2, …., aN (ai≤108) Dữ liệu
ra: Ghi ra tệp BAI5.OUT số lượng dãy con tìm được. Ví dụ:
BAI5.INP
42

BAI5.OUT
3

121 2
----------------------------- Hết ----------------------------Giám thị coi thi khơng giải thích gì thêm.



CHƯƠNG TRÌNH năm 2017-2018
Bài 1 (5 điểm):Hệ đếm
const fi='BAI1.inp';
fo='BAI1.out';
var f:text;
s:string;
i:byte;
t:int64;
begin
assign(f,fi);
reset(f);
readln(f,s);
close(f);
assign(f,fo);
rewrite(f);
t:=0;
for i:=1 to length(s) do
if s[i]='1' then
t:=t*2+1
else
t:=t*2;
write(f,t);
close(f);

Các bộ test

end.


Test
01
02
03
04
05
06
07
08
09
10

BAI1.INP
1000000
10000000001
001
1111011010101011
1011110101010110101101011
0000000000000000
11011010110111011011101
111011010111101010101010110111
1111010111011101011111101010111
11101011111110101111110101111111

Bài 2 (5 điểm): Tìm số nguyên tố

BAI1.OUT
64
1025
1

63147
24817003
0
7171805
996059831
2062466903
3959094655


const fi='BAI2.inp';
fo='BAI2.out';
var f:text;
m,n,k,i,dem,t,s:longint;
function kt(i:longint):boolean;
var j:longint;
begin
if i<2 then exit(false)
else
for j:=2 to trunc(sqrt(i)) do
if i mod j=0 then
exit(false);
exit(true);
end;
begin
assign(f,fi);
reset(f);
readln(f,m,n,k);


close(f);

assign(f,fo);
rewrite(f);
dem:=0;
for i:=m+1 to n-1 do
if kt(i) then
begin
t:=i;
s:=0;
while t>0 do
begin
s:=s+t mod 10;
t:=t div 10;
end;
if s mod k=0 then
inc(dem);
end;
write(f,dem);
close(f);
end.

Test
01
02
03
04
05
06
07
08
09

10

BAI2.INP
10 99 16
10 999 17
100 999 11
1000 9999 7
1000 100000 23
1 100000 34
1 100000 31
1 1000000 97
1 1000000 2
1 1000000 1

Bài 3 (4 Điểm): Taxi
const fi='BAI3.INP';
fo='BAI3.OUT';
var f:text;
d:array[1..4] of longint;
n,i,x,s:longint;
begin
assign(f,fi);
reset(f);

BAI2.OUT
2
19
19
127
848

205
395
0
38291
78498


readln(f,n);
for i:=1 to n do
begin
read(f,x);
inc(d[x]);
end;
close(f);
s:=d[4];
if d[3]>d[1] then
d[1]:=0
else
d[1]:=d[1]-d[3];
s:=s+d[3];
s:=s+d[2] div 2;
if d[2] mod 2=0 then
d[2]:=0
else
d[2]:=1;


if d[2]=1 then
begin
s:=s+1;

if d[1]>2 then
d[1]:=d[1]-2
elsed[1]:=0;
end;
if d[1] mod 4=0 then
s:=s+d[1] div 4
else
s:=s+d[1] div 4 +1;
assign(f,fo);
rewrite(f);
write(f,s);
close(f);
end.


Test
01

BAI3.INP

BAI3.OUT

6

4

02

1 3 4 3 2 1
60


37

4
3
2
4

03

4 1
2 3
4 3
1 3
100

3
3
2
1
4
4

04

4 4
4 4
2 1
4 4
3 3

1 3
300
4
2
1
2
4
4
4
4
4
4
3
2
4
4
3
2
1
2

4
1
4
3
3
3
4
1
3

1
3
2
2
4
1
2
1
4

1
3
3
1
2
2
2
2
1
3
1
3
2
4
2
2
1
2

1

4
1
1

2
4
3
1

4
2
1
1

3
4
2
2

3
2
3
2

2 4 3 2 2 1 4 4 3
3 1 3 1 1 4 2 4 1
1 2 2 3 1 3 3 4 2
2

66

3
2
1
1
2
1

3
1
1
3
3
3

3 2 1 2 2 3 4 3 2
3 2 4 2 4 1 1 3 1
2 3 4 1 2 1 2 1 3
1 1 3 3 4 4 4 2 3
2 4 1 3 4 1 1 2 4
3 4 3 4 4 1 3 2 1 2

3
4
3
3
4

2
1
2

4
2

2
4
4
3
2

188
3
3
2
1
4
1
4
4
2
2
4
4
3
3
2
2
2
1

2

1
3
2
2
4
3
1
1
4
3
4
1
2
3
4
2
1

3 4 1 2 4 2
3 4 4 3 3 4
1 3 2 4 3 4
1 3 2 2 2 3
1 3 4 2 3 1
4 3 3 2 4 2
4 4 1 4 3 4
1 2 4 2 4 4
3 4 4 3 4 1
2 3 4 1 1 1
4 4 1 2 1 4
1 1 3 3 1 4

4 1 1 2 3 1
1 3 4 4 4 2
2 1 1 1 4 1
4 4 2 3 3 4
3 1 2 1 1 1
1 1 2 1 1 2

3
3
4
3
1
4
3
1
4
4
1
4
3
2
4
2
2

2
1
3
4
4

2
2
1
1
3
3
2
3
4
1
2
1

4
3
4
4
3
2
1
1
1
4
2
3
1
3
4
1
2


3
1
1
2
3
1
2
1
3
3
3
1
2
3
3
1
4

3
3
1
1
4
2
2
3
2
3
1

4
3
3
4
1
1

3
1
4
1
2
3
3
4
1
4
3
2
1
2
2
3
4

05
06
07
08
Từ Test 05 đến Test 08 có dữ liệu lớn nên tơi xin đính kèm tài liệu này. Các bạn có thể tải về

tham khảo


Bài 4 (3 điểm): Hamming
const fi='BAI4.inp';
fo='BAI4.out';
ti=1000000000;
var f,ff:text;
m,n,i,d,j,k,max3:longint;
a:array[1..100000] of longint;
b:array[1..10000] of int64;
m2:array[0..30] of int64;
m3:array[0..19] of int64;
m5:array[0..13] of int64;
{=====================================}
procedure QS(L,R:longint);
var i,j,g,tg:longint;
begin
i:=L;
j:=R;
g:=b[(i+j) div 2];
while i<=j do
begin
while b[i]inc(i);
while b[j]>g do
dec(j);
if i<=j then
begin
if i

begin
tg:=b[i];
b[i]:=b[j];
b[j]:=tg;
end;
end;

inc(i);
dec(j);

end;
if iif j>L then QS(L,j);
end;
{===================================}
begin


m2[0]:=1;
for i:=1 to 30 do
m2[i]:=m2[i-1]*2;
m3[0]:=1;
for i:=1 to 19 do
m3[i]:=m3[i-1]*3;
m5[0]:=1;
for i:=1 to 13 do
m5[i]:=m5[i-1]*5;
d:=0;
for i:=0 to 29 do
begin

m:=ti div m2[i];
max3:=0;
while m3[max3]<=m do
inc(max3);
for j:=0 to max3-1 do
begin
m:=ti div (m2[i]*m3[j]);
k:=0;
while m5[k]<=m do
begin


inc(d);
b[d]:=m2[i]*m3[j]*m5[k];
end;inc(k);
end;

QS(1,d);
assign(f,fi);

end;

reset(f);
r
e
a
d
l
n
(

f
,
n
)
;
a
s
s
i
g
n
(
f
f
,
f
o
)
;
r
e
w
r
i
t
e
(
f



f

for j:=1 to

)
;
k

3

-1

0

1

1

1

1

13

:

k; if b[j]=m

18


-1

=

then

0

14

1

writeln(ff,j)

20

12

;

ewr

16

-1

f

lit
eel


19

1

o
r

nn(
dff

1

-1

14

4

i

;,-

4

-1

:

1)


26

14

=

;

20

17

1

c

27

2

t

l
end.
o

2

-1


o

s

14

-1

e

19

14

(

20

20

f

36

21

d

)


40

-1

o

;

66

4

b

c

4

-1

e

l

74

29

g


o

75

-1

i

s

44

-1

n

e

33

-1

82

-1

47

2


d)

2

17

l;

27

-1

n

71

-1

(

109

-1

105

-1

92


-1

)

59

-1

;

74

-1

197

-1

n

r(
ef
af

f
,
m



n nên tơi xin đính kèm tài liệu này. Các bạn có thể tải về tham

13
215

đ

91

ế

128

n

khảo
Bài 5 (3 điểm): Số lớn nhất

146
const fi='Bai5.inp';

74
51
182
295

T

f


e

o

s

=

t

17

'
B
a

233
22

0

82

6

287

i
5
.

o

287

c

u

390

ó

t
'

371
243

d


;
v
a

l

r

i


f



:

u

t
e

l
T




x
t
;
X
,
Y

T

:

e


s

s
t

t
r
i
n

0
59

3

g
;


C
:
a
r
r
a
y
[
0
.

.
2
0
0
,
0
.
.
2
0
0
]
o
f
s
t

n

ring

,

;

m

begi

,


n

i

assign(f

,

,fi);

j

reset(f)

:

;

l

readln(f

o

,X);

n

readln(f


g

,Y);

i

close(f)

n

;

t

n:=lengt

;

h(X);


m:=length(Y);
for i:=1 to n do
for j:=1 to m do
if X[i]=Y[j] then
begin
c[i,j]:=c[i-1,j-1]+X[i];
while (C[i,j]<>'') and (C[i,j][1]='0') do
delete(C[i,j],1,1);

end

if length(C[i,j-1])>length(C[i-1,j])
else
C[i,j]:=C[i,j-1]

then

elseif length(C[i-1,j])>length(C[i,j-1]) then
C[i,j]:=C[i-1,j]
else
if C[i,j-1]>C[i-1,j] then
C[i,j]:=C[i,j-1]
else
C[i,j]:=C[i-1,j];
assign(f,fo);
rewrite(f);
if c[n,m]='' then
begin
if (pos('0',X)>0) and (pos('0',Y)>0) then
write(f,0);
end
else
writeln(f,c[n,m]);
close(f);
end.

T

BAI5.INP


BAI5.OUT

e
s
t
0 9999999900000000000

0

1 8765432100000000
0 1234567801234567989

989

2 989654321087654321
0 1234567890123456789012345678901234567890123

989898989

3 456789
9876543210987654321098765432109876543210987


654321

0 9876543210987654321012345678901234567890987

9876543210987654321012345678901234


4 6543210987654321012345678901234567890123456

5678909876543210987654321098901234

7890123456789098765432109876543210123456789

5678901234567890987654321098765432

0123456789098765432109876543210000000000

1012345678901234567890000000000

1234567890123456789098765432109876543210123
4567890123456789098765432109876543210987654
3210987654321012345678901234567890987654321
0987654321012345678901234567890000000000
0
5
0
6

Từ Test 05 đến Test 06 có dữ liệu lớn nên tơi xin đính kèm tài liệu này. Các bạn có thể tải về
tham khảo


SỞ GIÁO DỤC VÀ ĐÀO TẠO
THANH HOÁ

KỲ THI HỌC SINH GIỎI CẤP TỈNH
Năm học: 2018-2019


ĐỀ CHÍNH THỨC

Mơn thi: Tin học - Lớp 11 THPT
Thời gian: 180 phút (không kể thời gian giao đề)
Ngày thi: 21/03/2019
Đề này có 05 câu, gồm 02 trang.

Số báo danh
…………………….

Tổng quan bài thi:
Tên bài
File chương trình File dữ liệu vào
File kết quả
Bài 1 Tổng số hoàn hảo
BAI1.*
BAI1.INP
BAI1.OUT
Bài 2 Cặp số nguyên
BAI2.*
BAI2.INP
BAI2.OUT
Bài 3 Đếm xâu con
BAI3.*
BAI3.INP
BAI3.OUT
Bài 4 Giai thừa
BAI4.*
BAI4.INP

BAI4.OUT
Bài 5 Dãy con
BAI5.*
BAI5.INP
BAI5.OUT
Dữ liệu vào là đúng đắn, không cần phải kiểm tra. Trong các file dữ liệu vào/ra, nếu dữ liệu
trên cùng một dịng thì được cách nhau bởi ít nhất 1 dấu cách. Dấu (*) trong tên file chương
trình biểu thị đi file tùy thuộc vào NNLT sử dụng ('pas' đối với NNLT PASCAL, ‘c’ đối với
NNLT C,...).

Bài 1 (6 điểm): Tổng số hoàn hảo.
Số hoàn hảo là số có tổng các ước số trừ nó bằng chính nó.

u cầu: Tính tổng các số hồn hảo nhỏ hơn hoặc bằng N.
Dữ liệu vào: Đọc từ tệp BAI1.INP - số nguyên N (1≤ N ≤ 105).
Dữ liệu ra: Ghi ra tệp BAI1.OUT kết quả tìm được.
Ví dụ:

BAI1.INP
30

BAI1.OUT
34

(có 2 số hoàn hảo nhỏ hơn hoặc bằng 30 là 6 và 28; 6+28=34)
Bài 2 (5 điểm): Cặp số nguyên.
Bài tốn tìm ước chung lớn nhất và tìm bội chung nhỏ nhất là hai bài tốn cơ bản.
Nhưng hơm nay thầy giáo cho cả lớp biết L là ước chung lớn nhất và G là bội chung nhỏ
nhất của 2 số nguyên dương.
Yêu cầu: Tìm 2 số nguyên dương a và b có tổng nhỏ nhất sao cho ước chung lớn nhất

của a và b bằng L, bội chung nhỏ nhất của a và b bằng G.
Dữ liệu vào: Đọc từ tệp BAI2.INP gồm 2 số L, G (1≤ LDữ liệu ra: Ghi ra tệp BAI2.OUT là 2 số a và b tìm được (a≤b)
Ví dụ:
BAI2.INP
4 60

BAI2.OUT
12 20


Bài 3 (4 điểm): Đếm xâu con.
Cho xâu S bao gồm các chữ cái ‘A’..’Z’ và các chữ số ‘0’..’9’.
Yêu cầu: Đếm số xâu con trong xâu S có số lượng chữ cái nhiều hơn số lượng chữ số
(xâu con của xâu S là một dãy kí tự liên tiếp trong xâu S).
Dữ liệu vào: Đọc từ tệp BAI3.INP gồm xâu S có độ dài ≤104
Dữ liệu ra: Ghi ra tệp BAI3.OUT kết quả tìm được.
Ví dụ:

BAI3.INP

BAI3.OUT

AC54C

6

Bài 4 (3 điểm): Giai thừa.
Cho trước số tự nhiên N.


Yêu cầu: Tìm số tự nhiên K nhỏ nhất sao cho K! có đúng N chữ số.
Dữ liệu vào: Đọc từ tệp BAI4.INP gồm một dòng chứa số tự nhiên N (1≤ N≤ 104).
Dữ liệu ra: Ghi ra tệp BAI4.OUT kết quả tìm được. Nếu khơng có số K nào thoả mãn
u cầu đề ra thì ghi -1.
Ví dụ:
BAI4.INP
3

BAI4.OUT
5

Bài 5 (2 điểm): Dãy con.
Cho dãy số tự nhiên A gồm N phần tử a 1, a2, …., aN và số nguyên dương K. Dãy con a i,
ai+1, …, aj (1≤i≤j≤N) là dãy được tạo từ các phần tử liên tiếp của dãy A, bắt đầu từ phần tử
thứ i và kết thúc ở phần tử thứ j.

Yêu cầu: Tìm số lượng dãy con của dãy A có ít nhất K phần tử bằng nhau.
Dữ liệu vào: Đọc từ tệp BAI5.INP
• Dịng đầu tiên chứa 2 số ngun dương N, K (1≤ K≤N≤4x105).
• Dịng thứ 2 chứa N số tự nhiên a1, a2, …., aN (ai≤108) Dữ liệu
ra: Ghi ra tệp BAI5.OUT số lượng dãy con tìm được. Ví dụ:
BAI5.INP
42

BAI5.OUT
3

121 2
----------------------------- Hết ----------------------------Giám thị coi thi khơng giải thích gì thêm.



CHƯƠNG TRÌNH năm 2018-2019
Bài 1 (6 điểm): Tổng số hồn hảo.
const fi='BAI1.INP';
fo='BAI1.OUT';
var f:text;
s,i,n:longint;
{===============================}
function shh(n:longint):boolean;
var s,i:longint;
begin
s:=0;
for i:=1 to trunc(sqrt(n)) do
if n mod i=0 then
s:=s+i+ n div i;
if i=sqrt(n) then
s:=s-i;
s:=s-n;
shh:=s=n;
end;
{===============================}
BEGIN
assign(f,fi);
reset(f);
read(f,n);
close(f);
s:=0;
for i:=2 to n do
if shh(i) then
s:=s+i;

assign(f,fo);
rewrite(f);
write(f,s);
close(f);
END.

Có 12 Test, mỗi test đúng được 0.5 điểm

Test
01
02
03
04
05
06
07
08
09
10
11
12

BAI1.INP
29
100
500
1000
3000
5000
6578

8564
12468
16840
90000
100000

BAI1.OUT
34
34
530
530
530
530
530
8658
8658
8658
8658
8658


Bài 2 (5 điểm): Cặp số nguyên.
Giả sử
A=L*K1
B=L*k2
Do L là ước chung lớn nhất của A và B nên ước chung lớn nhất của K1 và K2 bằng 1
Vì G là bội chung nhỏ nhất của A và B nên ta có:
G=

A * B K1* L * K 2 * L

= L * K1* K 2
L =
L

Do G chia hết cho L nên ta có K1*K2=G div L

const fi='BAI2.INP';
fo='BAI2.OUT';
var f:text;
L,G,a,b,k1,k2,m,min:longint;
{================================}
Function UCLN(a,b:longint):longint;
begin
while (a>0) and (b>0) do
if a>b then
a:=a mod b
else
b:=b mod a;
UCLN:=a+b;
end;
{===============================}
begin
assign(f,fi);
reset(f);
readln(f,L,G);
close(f);
m:=G div L;
min:=L+G;
for k1:=1 to trunc(sqrt(m)) do
if m mod k1=0 then

begin
k2:=m div k1;
if UCLN(k1,k2)=1 then
begin
a:=k1*L;
b:=k2*L;
if min>a+b then
min:=a+b;
end;
end;
assign(f,fo);
rewrite(f);
write(f,a,' ',b);
close(f);
end.


Có 10 Test, mỗi test đúng được 0.5 điểm

Test
01
02
03
04
05
06
07
08
09
10


BAI2.INP
4 24
6 456
2 434
68 2584
36 2952
48 3936
54 2268
464 38976
3000 798000
2500 935000

BAI2.OUT
8 12
24 114
14 62
136 1292
72 1476
96 1968
324 378
3248 5568
42000 57000
42500 55000

Bài 3 (4 điểm): Đếm xâu con.
Gọi a[i] là số chữ cái in hoa từ kí tự thứ 1 đến kí tự
thứ i Gọi b[i] là số chữ số từ kí tự 1 đến kí tự thứ i
Khi đó đoạn kí tự từ s[i] đến s[j] có số chữ cái in hoa nhiều hơn số chữ số nếu a[j]-a[i-1]>b[j]-b[i-1]
const fi='BAI3.INP';

fo='BAI3.OUT';
var f:text;
s:ansistring;
n,i,j,d:longint;
a,b:array[0..10000] of longint;
begin
assign(f,fi);
reset(f);
readln(f,s);
close(f);
n:=length(s);
a[0]:=0;
for i:=1 to n do
if (s[i]>='A') and (s[i]<='Z') then
a[i]:=a[i-1]+1
elsea[i]:=a[i-1];
b[0]:=0;
for i:=1 to n do
if (s[i]>='0') and (s[i]<='9') then
b[i]:=b[i-1]+1
elseb[i]:=b[i-1];
d:=0;

end.

for i:=1 to n do
for j:=i to n do
if a[j]-a[i-1]>b[j]-b[i-1] then
inc(d);
assign(f,fo);

rewrite(f);
write(f,d);
close(f);


×