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

(SKKN mới NHẤT) SKKN một số kinh nghiệm giảng dạy về tính toán đồng dư cho học sinh giỏi quốc gia môn tin học

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 (554.85 KB, 17 trang )

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

TRƯỜNG THPT CHUYÊN LAM SƠN

SÁNG KIẾN KINH NGHIỆM

MỘT SỐ KINH NGHIỆM GIẢNG DẠY VỀ TÍNH TỐN
ĐỒNG DƯ CHO HỌC SINH GIỎI QUỐC GIA
MƠN TIN HỌC

Người thực hiện: Phạm Thị Nga
Chức vụ: Giáo viên
SKKN thuộc lĩnh vực (mơn): Tin học

THANH HỐ NĂM 2019

download by :


Mục lục
1. Mở đầu........................................................................................................................... 3
1.1. Lí do chọn đề tài......................................................................................................3
1.2. Mục đích nghiên cứu...............................................................................................3
1.3. Đối tượng nghiên cứu..............................................................................................3
1.4. Phương pháp nghiên cứu.........................................................................................3
1.5. Những điểm mới của SKKN...................................................................................3
2. Nội dung sáng kiến kinh nghiệm....................................................................................4
2.1. Cơ sở lí luận của sáng kiến kinh nghiệm.................................................................4
2.1.1. Định nghĩa và các tính chất của hàm nhân tính................................................4
2.1.2. Phương pháp để tính một hàm nhân tính..........................................................4
2.1.3. Tính tốn đồng dư cơ bản.................................................................................5


2.1.4. Các định lí dùng tính tốn đồng dư và hệ quả..................................................6
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm..................................8
2.3. Các giải pháp được sử dụng để giải quyết vấn đề....................................................8
Bài 1. POWERTOWER - Tháp luỹ thừa........................................................................9
Thuật toán..................................................................................................................9
Code, Test và Cảm nhận..........................................................................................10
Bài 2. DPEQN - Congruence Equation........................................................................10
Thuật toán................................................................................................................11
Test và cảm nhận......................................................................................................11
Bài 3. GCDSUM - Tổng các ước chung lớn nhất.........................................................11
Thuật toán................................................................................................................12
Test và cảm nhận......................................................................................................12
Bài 4. VOSPOW - Độ bá đạo của đội hình..................................................................12
Thuật tốn................................................................................................................13
Test và Cảm nhận.....................................................................................................14
2.4. Hiệu quả của sáng kiến kinh nghiệm đối với hoạt động giáo dục, với bản thân,
đồng nghiệp và nhà trường...........................................................................................14
3. Kết luận, kiến nghị.......................................................................................................14
Tài liệu tham khảo............................................................................................................15

2

download by :


1. Mở đầu
1.1. Lí do chọn đề tài
Các bài tốn trong thi học sinh giỏi quốc gia liên quan đến Toán học thường sẽ rơi
vào hai mảng là số học và hình học. Nếu biết nhiều về số học, học sinh sẽ có khả năng
giải quyết nhiều bài tốn khó và một nền tảng tốt để giải quyết nhiều bài toán khác.

Các bài toán trong thi học sinh giỏi quốc gia thường địi hỏi phải có một cái nhìn
sâu sắc, vì vậy chỉ biết một số vấn đề về số học là khơng đủ. Mọi bài tốn đều u cầu
học sinh phải biết một lượng kiến thức tốn nhất định. Ví dụ, một số bài toán yêu cầu học
sinh phải giải một hệ nhiều phương trình hay tính xấp xỉ nghiệm của nhiều phương trình
khác nhau.
Tính tốn đồng dư là một phạm trù khó, được tiếp cận và đưa vào thi cũng như
trong giảng dạy, ôn luyện cho học sinh thi học sinh giỏi quốc gia những năm gần đây.
Hiện tại, chưa có các tài liệu nghiên cứu nào bàn sâu vào vấn đề này, đồng nghiệp, nhà
trường chưa có kinh nghiệm để giảng dạy nội dung nâng cao này. Vì vậy, trong hai năm
học vừa qua, là giáo viên trực tiếp giảng dạy và phụ trách đội tuyển học sinh giỏi quốc
gia tỉnh Thanh Hóa, tơi đã tìm hiểu và có “MỘT SỐ KINH NGHIỆM GIẢNG DẠY VỀ
TÍNH TỐN ĐỒNG DƯ CHO HỌC SINH GIỎI QUỐC GIA MÔN TIN HỌC”. Nay
xin được trình bày đề tài này như là sáng kiến kinh nghiệm của bản thân tơi.
1.2. Mục đích nghiên cứu
Nội dung thi học sinh giỏi tin học cũng như lập trình thi đấu ngày càng mở rộng
và tăng độ khó do thực tiễn nhu cầu xã hội và bối cảnh phát triển của tin học, công nghệ
thông tin hiện nay. Tính tốn đồng dư là một nội dung mới, được mở rộng giới hạn bài
tốn và tốc độ xử lí, được tôi nghiên cứu và đưa vào giảng dạy cho học sinh đội tuyển
học sinh giỏi quốc gia, nhằm cung cấp cho học sinh phần kiến thức mới, mở rộng, đồng
thời rèn luyện cho học sinh các kĩ năng giải quyết những bài toán trong phạm vi thi học
sinh giỏi quốc gia về tính tốn đồng dư.
1.3. Đối tượng nghiên cứu
Sáng kiến kinh nghiệm trình bày một số kinh nghiệm, phương pháp trong q
trình giảng dạy về tính tốn đồng dư cho học sinh giỏi quốc gia và những kết quả mà tơi
đã đạt được trong việc áp dụng nó giảng dạy cho đội tuyển học sinh giỏi tin học tỉnh
Thanh Hóa năm học 2017 – 2018; 2018 – 2019.
1.4. Phương pháp nghiên cứu
- Nghiên cứu lí thuyết ứng dụng
- Phương pháp thực nghiệm khoa học
- Phương pháp phân tích tổng kết kinh nghiệm

1.5. Những điểm mới của SKKN
- Chưa có đồng nghiệp, tài liệu nào trình bày hoặc tổng hợp về kinh nghiệm giảng
dạy phần tính tốn đồng dư cho học sinh giỏi môn tin học.
- Những kinh nghiệm này được trình bày thơng qua việc nghiên cứu, giảng dạy cơ
sở lí thuyết thuật tốn và áp dụng giảng dạy từng bước cụ thể trên 4 bài tốn điển
hình áp dụng thuật toán theo cấp độ từ dễ đến khó, là những bài tốn chưa được
trình bày cách tiếp cận và lời giải ở một tài liệu nào khác.
3

download by :


2. Nội dung sáng kiến kinh nghiệm
2.1. Cơ sở lí luận của sáng kiến kinh nghiệm
2.1.1. Định nghĩa và các tính chất của hàm nhân tính
2.1.1.1. Định nghĩa
- Hàm

( là số nguyên) là một hàm nhân tính nếu với mọi cặp số nguyên

nguyên tố cùng nhau thì
- Hàm
nguyên

( là số ngun) là một hàm nhân tính hồn tồn nếu với mọi cặp số

thì

2.1.1.2. Tính chất
- Theo định lí số học cơ bản[1]: với mọi số nguyên dương n, tồn tại duy nhất một

cách viết n dưới dạng tích của luỹ thừa các số nguyên tố:
sao cho

là các số nguyên dương và

là các số nguyên tố tăng dần.
Nếu

là một hàm nhân tính thì:

.
- Dirichlet Convolution[2]: Nếu



là hai hàm nhân tính thì:

cũng là một hàm nhân tính.
2.1.1.3. Một số hàm nhân tính cơ bản
- Hàm hằng

định nghĩa là

- Hàm định nghĩa

.

.

- Hàm luỹ thừa

( là hằng số)
- Cả ba hàm trên đều là hàm nhân tính hồn tồn.
2.1.2. Phương pháp để tính một hàm nhân tính
2.1.2.1 Chứng minh hàm cần tính là một hàm nhân tính
a. Chứng minh bằng cơng thức
Nếu hàm
có cơng thức khơng phụ thuộc vào việc nó có là hàm nhân tính
khơng, để chứng minh

là hàm nhân tính, ta có thể chứng minh

(với mọi m, n nguyên tố cùng nhau) bằng cách biến đổi cơng
thức. Ví dụ xét hàm
Nếu

là số ước của .

phân tích ra thừa số nguyên tố có dạng
4

download by :

thì


.
Xét n và m nguyên tố cùng nhau và:
.
.
thì


.
.
.

nên
là một hàm nhân tính.
b. Chứng minh sử dụng Dirichlet Convolution
- Xét hai hàm

, cả hai hàm này đều là hàm nhân tính nên theo
Dirichlet Convolution,
. Đây chính là hàm đếm số ước của .
- Đơi khi có những hàm chứng minh bằng cách biến đổi vất vả hơn rất nhiều so
với sử dụng Dirichlet Convolution. Xét vì dụ hàm
là tổng các ước của . Sử dụng
Dirichlet Convolution với hai hàm



có:
.

Nên

là một hàm nhân tính.

2.1.2.2. Tìm cách tính trường hợp cơ bản

- Hàm nhân tính giúp ta rút gọn việc tính


cho mọi số nguyên dương

thành tính
với
là một số nguyên tố, là số ngun dương.
- Nếu có cơng thức cho f(n) thì sử dụng cơng thức này.
- Nếu khơng có cơng thức nhưng có một thuật tốn để tính thì tính cho
trường hợp này riêng.
2.1.2.3. Tính hàm nhân tính
- Nếu chỉ tính một giá trị của hàm thì phân tích ra thừa số nguyên tố và tính riêng
cho từng thừa số nguyên tố. Chỉ có tác dụng khi hàm này khó/ khơng có cơng thức để
tính trong trường hợp chung.
- Tính cho tất cả các giá trị thoả mãn
Thực hiện sàng nguyên tố,
trong lúc sàng với mỗi số lưu lại số nguyên tố bé nhất là ước của nó. Duyệt tăng dần,
kiểm tra kiểu của . Nếu là luỹ thừa của một số ngun tố thì dùng thuật tốn riêng để
tính giá trị, nếu khơng thì dùng tính chất của hàm nhân tính để tính.
Thuật tốn trên có độ phức tạp là
với là số luỹ thừa của số
nguyên tố không vượt quá



là độ phức tạp để tính hàm cho luỹ thừa của một số
5

download by :



nguyên tố. Thuật toán thực hiện sàng nguyên tố mất
số có phải là số ngun tố khơng mất

, kiểm tra xem mỗi

. Đặc biệt nếu hàm cần tính là hàm nhân

tính hồn tồn, độ phức tạp giảm cịn là O(

). Vì có

số

.[3]

ngun tố

2.1.3. Tính tốn đồng dư cơ bản
2.1.3.1. Định nghĩa
- Với mọi cặp số nguyên



, tồn tại duy nhất một cặp số ngun

sao cho:
- Hai số
Kí hiệu

. Khi đó ta nói là số dư khi chia


cho



và kí hiệu

. Kí hiệu để biểu diễn phép tính chia lấy dư (
).
và thoả mãn
thì ta nói và đồng dư với nhau qua modulo

.

2.1.3.2. Các tính chất cơ bản và các phép tính
Các số

đều là số ngun và

-Tính đối xứng:

.

thì

-Tính bắc cầu:



thì


-Tính tương đồng khi cộng cùng giá trị:

thì

-Tính tương đồng khi nhân cùng giá trị:

thì

-Tính tương đồng khi cộng:



-Tính tương đồng khi trừ:

thì



-Tính tương đồng khi nhân:

thì



thì

-Tính tương đồng khi nâng lên cùng lũy thừa:

thì


-Tính tương đồng khi tính tốn đa thức:
đa thức

.

thì

với mọi

có các bậc và hệ số của các bậc ngun.

-Tính loại trừ khi cộng:

thì

-Tính loại trừ khi nhân:
ngun tố cùng nhau.

thì

nếu



là hai số

2.1.3.3. Nghịch đảo modulo
-Sự tồn tại: Với hai số nguyên
nguyên




, tồn tại duy nhất một số

thoả mãn

nhau. Khi đó ta kí hiệu

khi và chỉ khi



là nghịch đảo nhân modulo của

nguyên tố cùng
. Lưu ý rằng

là một sự lạm dụng kí pháp vì
khơng phải là một số ngun khi a khác 1 hay -1,
tuy nhiên vẫn được sử dụng thường xun để tiện cho việc trình bày.
-Tính tương đồng khi nghịch đảo modulo: Nếu
và tồn tại
thì
6

download by :


-Nếu


và tồn tại

-Với số nguyên tố

thì

thì tồn tại

cho tất cả số ngun

thoả mãn

khác .

2.1.4. Các định lí dùng tính tốn đồng dư và hệ quả
2.1.4.1. Định lí nhỏ Fermat[4]
Nếu

là một số nguyên tố thì với mọi số nguyên ,

là một bội số của .

-Kí hiệu:
-Hệ quả khi



nguyên tố cùng nhau:


. Khi đó

là nghịch đảo

modulo của
2.1.4.2. Hàm phi Euler
a. Định nghĩa và kí hiệu
Hàm phi Euler cho một số nguyên dương n được định nghĩa là số lượng số nguyên
dương nguyên tố cùng nhau với sao cho
. Kí hiệu:
b. Cơng thức tính
Cơng thức tích của Euler:
với mọi số ngun tố .
c. Tính chất của hàm phi Euler
là một hàm nhân tính.
-

là số chẵn nếu

-Nếu

(

.

nguyên) với

là một số nguyên tố thì

-Lưu ý

d. Phương pháp tính hàm phi Euler
-Tính một giá trị
Phân tích

ra thừa số nguyên tố và sử dụng công thức

nhân Euler. Độ phức tạp của thuật toán này là độ phức tạp để phân tích ra thừa số
nguyên tố.
-Tính tất cả các giá trị
với
: Thực hiện sàng nguyên tố cho tất cả
các số nguyên
.
Duyệt các giá trị của
nhỏ nhất là ước của
Nếu

tăng, trong lúc sàng nguyên tố cũng lưu lại số ngun tố

gọi số đó là . Tìm

với lớn nhất sao cho

.

thì dùng cơng thức dành cho luỹ thừa của số ngun tố, nếu khơng thì

dùng tính chất của hàm nhân tính:

7


download by :


Code mẫu C++:
const int maxp=1000000;
int p[maxp+1];
int phi[maxp+1];
void calculate_phi(){
phi[1]=1;
for(int i=2; i<=maxp; i++)
if(p[i]==0)
for(int j=i; j<=maxp; j+=i)
if(p[j]==0) p[j]=i;
for(int i=2; i<=maxp; i++){
int x=i; int t=p[i]; int k=1;
while(x%t==0){
k*=t; x/=t;
}
if(x>1) phi[i]=phi[k]*phi[x];
else phi[i]=i-i/p[i];
}
}

Code trên có độ phức tạp là

tuy nhiên thời gian chạy rất nhanh kể cả khi

.
e. Ứng dụng của hàm phi Euler trong tính tốn đồng dư

- Định lí Euler: Nếu hai số nguyên dương và nguyên tố cùng nhau thì:
- Hệ quả của định lí Euler:

nếu

- Hệ quả của định lí Euler: nếu hai số
nếu







nguyên tố cùng nhau.

thoả mãn

nguyên tố cùng nhau.

2.1.4.3. Định lí phần dư Trung Hoa
a. Định nghĩa
-Xét hệ phương trình đồng dư:

8

download by :

thì



trong đó
đơi một ngun tố cùng nhau.
Định lí phần dư Trung Hoa chỉ ra rằng:
Hệ phương trình đồng dư nói trên có nghiệm duy nhất theo modul
.
nghiệm

đó



với



b. Trường hợp
-Vì

đơi một nguyên tố cùng nhau nên giải được trường hợp khi

là sẽ giải được trường hợp tổng quát bằng cách thực hiện thuật tốn
cho việc cài đặt đơn giản hơn.
-Ta có
nên
.
nên

lần, kiến


.

Vậy

. Phương trình này có thể viết lại thành
với

là các số ngun. Đây là một phương

trình Diophantine tuyến tính, nên có thể giải được giá trị

bằng giải thuật Euclid

mở rộng[5], từ đó suy ra .
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm
- Trong cả hai năm dạy bồi dưỡng đội tuyển học sinh giỏi quốc gia, hơn 60% học sinh đội
tuyển chưa được tiếp cận với các bài toán về đồng dư, gần 40% học sinh còn lại dù đã
được tiếp cận nội dung các bài toán đồng dư, nhưng chỉ bằng con đường tự tìm hiểu thêm
các tài liệu chun mơn trên internet và được viết bằng tiếng Anh là chủ yếu.
- Đồng nghiệp trong nhà trường và cả những trường chuyên bạn trong nước cũng có rất ít
tài liệu, kinh nghiệm giảng dạy về tính tốn đồng dư cho đối tượng học sinh giỏi, vì đây
là một nội dung mở, mới.
2.3. Các giải pháp được sử dụng để giải quyết vấn đề
Tôi đã đọc, tham khảo thêm các tài liệu viết về nội dung này trên internet, dịch
thuật từ các tài liệu tiếng Anh trên các diễn đàn, website về thuật toán, lập trình thi đấu và
tham khảo lời giải các kì thi tin học trong ba năm trở lại đây như IOI, APIO, BIO,
ACM,... Từ đó nhận định và đưa ra các bài tập theo dạng, phân lớp bài toán theo mức độ
từ dễ đến khó, dạy lí thuyết đến đâu áp dụng cho bài tập đến đó. Cho học sinh phân tích,
đốn nhận giải thuật, sau đó hướng dẫn giải thuật, cho học sinh lập trình giải bài. Các bài
tập đều được test cẩn thận cho học sinh, đánh giá độ phức tạp để học sinh có cơ sở so

sánh, cảm nhận được sự tối ưu và cái hay, cái đẹp của lời giải, của thuật toán. Cụ thể,
9

download by :


dưới đây là 4 bài tập được chọn lọc và lồng ghép đưa vào giảng dạy theo mức độ từ dễ
đến khó.
Bài 1. POWERTOWER - Tháp luỹ thừa
Cho 2 số ngun khơng âm
với
.
Tháp luỹ thừa bậc của được định kí hiệu là
=

được định nghĩa:
( lần)

Chú ý rằng khi tính giá trị tháp lũy thừa thì các phép lũy thừa được thực hiện theo
thứ tự từ trên xuống.
Yêu cầu: Cho 3 số
tính
.
Input: Nhập vào dữ liệu từ file POWERTOWER.INP:
Dịng đầu là số nguyên dương t, số bộ test.
Trong t dòng tiếp theo, mỗi dòng 3 số nguyên dương a, n, m <=10^5 cách nhau
bởi dấu cách.
Output: Với mỗi dòng dữ liệu từ file input, ghi ra file POWERTOWER.OUT một dòng
là kết quả bài tốn.
Ví dụ:

POWERTOWER.INP
POWERTOWER.OUT
6
1
1 4 100
56
4 2 100
987
3 3 1000
8656
6 5 10000
36
2 100000 100
41154
100000 20 78923
Thuật toán
- Định nghĩa hàm F(a, n, m) là kết quả của bài toán. Các trường hợp đặc biệt gồm có:
F(1, n, m)=1%m;
F(a, n, 1)=0;
F(a, 0, m)=1%m;
F(a, 1, m)=a%m;
- Khi không trường hợp đặc biệt nào xảy ra, ta biết rõ a>1, m>1, n>1;
- Nhận thấy rằng để rút gọn bài toán, cần sử dụng hệ quả thứ 3 của định lí Euler,
tuy nhiên nhận thấy rằng gcd(a, m) chưa chắc chắn đã bằng 1, vì vậy cần chia m thành
hai phần:
m1 và m2 với m1*m2=m và gcd(a, m2)=1=gcd(m1, m2)=1 và sử dụng định lí
phần dư Trung Hoa.
- F(a, n, m2)≡aF(a, n-1, ϕ(m2)) (mod m2) tính được bằng cách gọi đệ quy tính F(a, n-1,
ϕ(m2)) và dùng thuật tốn luỹ thừa nhanh để tính trong O(log(F(a, n-1, ϕ(m2)))).
- Để tính F(a, n, m1) thì nhận thấy là m1<=10^5 nên một số mũ tối đa của một số

ngun tố nào đó của m1 khơng vượt q 20 (2^20>10^5) nên a^x%m1=0 nếu x>=20.
Xét các trường hợp sau:
Nếu a=2 thì
n>4=>F(a, n, m1)=0
n<=4 có thể tính chính xác a⇈n
10

download by :


Nếu a>=32 thì a⇈n>=20 vì n>1.
Nếu n>2 thì a⇈n>=20 vì 3⇈3>=20.
Nếu khơng thì n=2 có thể tính được a^a bằng thuật tốn luỹ thừa nhanh.
- Sau khi tính được F(a, n, m1) và F(a, n, m2) sử dụng định lí đồng dư Trung Quốc
và tính F(a, n, m). Có thể sử dụng cách tính nêu trên hoặc áp dụng thẳng công thức tổng
quát.
Đánh giá độ phức tạp
Với mỗi hàm F(a, n, m) được gọi, tính mất O(log(a)) vì:
Tối đa 2 lần tính luỹ thừa nhanh. m1 và m2 tính trong log(a) vì có thể phân tích ra
thừa số ngun tố các giá trị này trong O(log(a)) nếu chuẩn bị sẵn mảng số nguyên tố bé
nhất là ước trong khi sàng ngun tố tính hàm phi Euler.
Thoạt nhìn, độ phức tạp thuật tốn sẽ là O(n*log(a)) cho mỗi test vì hàm F(a, n, m)
có thể bị gọi tới n lần, tuy nhiên độ phức tạp thực tế là O(min(n, log(m))*log(a)) vì:
Hàm F(a, n, m) gọi hàm F(a, n-1, ϕ(m2)) mà m2<=m và ϕ(m2) là số chẵn nếu
m2>3 nên từ lần đệ quy thứ 2, m2 chẵn hoặc m2<3. Nếu m2 là số chẵn thì ϕ(m2)<=m2/2
(dựa theo cơng thức nhân của Euler), nếu m2<3 thì m2=1. Do đó từ lần thứ 2 sau mỗi lần
gọi hàm, m trong F(a, n, m) sẽ bị giảm đi ít nhất 2 lần, hay chỉ tốn tối đa log(m) lần gọi
hàm cho đến khi gặp một trường hợp đặc biệt.
Code, Test và Cảm nhận
/>Bài toán tháp luỹ thừa về mặt thuật tốn thì thẳng thắn, đơn giản tuy nhiên lại yêu

cầu có một số hiểu biết về tính tốn đồng dư. Việc đánh giá đúng độ phức tạp cho ta một
kết quả hay nhưng đơn giản mà lại khó tìm thấy.
Bài 2. DPEQN - Congruence Equation
Cho phương trình đồng dư:
Trong đó
và là các hằng số ngun dương cho trước.
là các ẩn.
Tìm một nghiệm của phương trình trên, hoặc thơng báo phương trình vơ nghiệm.
Dữ liệu: Dịng đầu tiên ghi số bộ test, mỗi bộ test có dạng như sau:
Dòng 1:
Dòng 2: gồm

số nguyên

 

Dòng 3:
Mỗi bộ test được phân cách bởi một dòng trắng ở đầu.
Kết quả:
Với mỗi bộ test, nếu phương trình khơng có nghiệm, in ra dịng "NO". Trong
trường hợp có nghiệm, in ra trên một dịng số ngun
 (
) là một nghiệm tìm được.
Ví dụ:
Dữ liệu
Kết quả
2
12
2
NO

46
6 10
11

download by :


2
46
38
Thuật tốn
Vì đây là một phương trình đồng dư nên ta không cần quan trọng phải giải được nghiệm
nguyên trong nửa khoảng [0, m], chỉ cần giải nghiệm nguyên bất kì là tìm được nghiệm
trong khoảng đó.
Trước hết xét phương trình Diophantine
với
là hằng số có nghiệm khi
. Thay đổi góc nhìn, ta
có hàm hai chiều

với

kì hay nói cách khác, nếu phương trình là
nó về

có nghiệm với k là một số bất
, ta có thể rút gọn các giá trị có thể của

.
Cứ đệ quy như vậy, phương trình trong đề bài trở thành dạng:


với là một số nguyên nào đó. Phương trình trên có thể viết lại thành:
với cũng là một số nguyên.
Đây lại là một phương trình Diophantine. Phương trình này có nghiệm thì có kết
quả, nói cách khác bài tốn có nghiệm khi và chỉ khi
|b. Việc kiểm
tra xem phương trình có nghiệm hay khơng là đơn giản. Vậy làm thế nào để giải ra
nghiệm khi có nghiệm?
Đầu tiên giải
để tìm ra . Đưa
về dạng
để tránh bị tràn số khi xử lí tiếp. Bây giờ phải giải
.
Phương trình này khơng khác gì phương trình mà ta bắt đầu với, nên giải tượng tự
và thi được , chính là ra trí của , sau đó lại đi giải tiếp
+
=
Các bước đều như nhau nên có thể đệ quy để giải. Khi phương trình được rút gọn
về dạng
thì có thể giải thẳng giá trị

ln. Sau đó chỉ việc
chuyển các giá trị về đúng dạng
(bằng cách mod cho ).
Mất
lần tìm ước chung lớn nhất và
lần giải phương trình Diophantine
nên độ phức tạp là
.
Chú ý có thể cải thiện thời gian chạy bằng cách đệ quy tìm gcd của k số đầu tiên,

thử xem k số đó đã đủ để giải phương trình chưa, nếu rồi thì cho tất cả các x còn lại bằng
0 là được. Cách này độ phức tạp xấu nhất vẫn sẽ là
tuy nhiên độ phức tạp
trung bình xuống cịn
vì: Với số a, chuyển từ a đến gcd(a, b) thì gcd(a,
b)=a hoặc gcd(a, b)|a=>gcd(a, b)nêu sau trung bình O(log(a)) bước thì gcd(a, b) sẽ trở thành 1, đảm bảo giải được phương
trình.
Test và cảm nhận
Học sinh chấm bài tại đây />12

download by :


Bài DPEQN yêu cầu học sinh hiểu rõ bản chất của thuật tốn Euclid mở rộng, phương
trình Diophantine khi áp dụng trong tính tốn đồng dư. Bài cũng u cầu khả năng cài đặt
đệ quy, giúp giảm gánh nặng cho người cài đặt.
Bài 3. GCDSUM - Tổng các ước chung lớn nhất
Một lần, ktuan được thầy giáo cho bài tập về nhà, yêu cầu tính tổng tất cả các ước
chung lớn nhất của các cặp số (i, j) thỏa mãn : 1<=i< j<=N ( N là một số tự nhiên cho
trước ). Rất nhanh chóng, ktuan đã cho ra một đoạn code như sau:
for i:=1 to N-1 do for j:=i+1 to N do sum := sum + gcd( i, j);

với gcd là hàm tính ước chung lớn nhất của 2 số, sum chính là kết quả cuối cùng.
Thầy giáo yêu cầu ktuan dùng chương trình trên để tính kết quả với N = 1000000.
Tuy nhiên, chương trình trên chạy quá lâu. Để khắc phục vấn đề, ktuan đã viết lại đoạn
mã đó bằng C++ ( với hi vọng C++ sẽ chạy nhanh hơn pascal nhiều ) :
for(int i=1;i< N;++i) for(int j=i+1;j<=N;++j) sum += gcd(i,j);

Thật khơng may, đoạn chương trình trên vẫn không giải quyết được vấn đề, bạn hãy giúp

ktuan giải đáp yêu cầu của thầy giáo.
Lưu ý: bài này có thể giải bằng phương pháp Quy hoạch động và các kiến thức sơ đẳng
trong tốn học, khơng cần sử dụng những kiến thức tốn học phức tạp khơng nằm trong
phạm vi chương trình phổ thơng.
Dữ liệu:
Gồm nhiều dịng, mỗi dòng là một số N ( 1<=N<=10^6) ứng với một test. Dữ liệu
vào sẽ kết thúc sau khi gặp N=0 ( bạn không cần thực hiện test này ).
Kết quả:
Với mỗi giá trị của N, in ra một dòng là giá trị của sum sau khi thực hiện đoạn mã
trên.
Ví dụ:
Dữ liệu
Kết quả
4
7
0
Thuật toán
Giả sử số thứ nhất lớn hơn số thứ hai, thay đổi lại góc nhìn của bài tốn, thay vì
duyệt mọi cặp số và tính ước chung lớn nhất, ta duyệt các cặp số thứ nhất, ước chung lớn
nhất của hai số và tính số lượng số thứ hai. Rõ ràng ước chung lớn nhất là ước của số thứ
nhất, nên đây chính xác là duyệt số cặp ước bội. Điều này làm được trong
Với mỗi cặp ước bội

, có bao nhiêu số ngun dương

Khi
Khi

thì kết quả là 0, nếu khơng
thì ta có thể viết


Do

nên



. Nên ta cần đếm số lượng

. Do tính được các giá trị của
số n giá trị

trước trong



với

?
,



. Đây chính là
nên ta có thể tính với mỗi

13

download by :



Kết quả bài toán đơn thuần chỉ là tổng tiền tố từ

đến

.

Test và cảm nhận
Có thể chấm bài tại đây />Bài GCDSUM địi hỏi học sinh phải có hiểu biết về hàm phi Euler, biết đánh giá đúng độ
phức tạp của đoạn code và biết thay đổi khía cạnh của bài toán.
Bài 4. VOSPOW - Độ bá đạo của đội hình
Trường XYZ và trường ABC sẽ tổ chức giải bóng chuyền với mục đích tạo ra sân
chơi lành mạnh giữa các học sinh của hai trường và cũng là dịp để các học sinh tìm hiểu
kỹ hơn về trường bạn. Vì sân vận động rất lớn nên mỗi đội có tới N người chơi. Trường
XYZ là một trường chuyên về các môn tự nhiên cịn trường ABC là trường chun về
các mơn xã hội. Để chuẩn bị chiến thuật cho giải đấu sắp tới, trường XYZ cần phải
biết mức độ bá đạo của đội bên kia. Nhờ quen biết rộng nên trường XYZ đã biết được
chỉ số trung bình các thí sinh sắp tới sẽ chơi cho đội của trường ABC. Độ bá đạo của của
một đội bóng chuyền sẽ có giá trị bằng tổng độ bá đạo của các thành viên trong đội và lấy
phần dư trong phép chia cho BASE trong đó độ bá đạo của mỗi thành viên sẽ bằng lũy
thừa bậc Q của chỉ số trung bình của thành viên đó. Biết rằng Q có dạng là kT.
Yêu cầu: Tính độ bá đạo của đội bóng trường ABC.
Dữ liệu vào:
Dịng đầu chứa số N, k, T, BASE trong đó N <= 107, k <= 50, T <= 105, BASE <= 1012 .
Dòng tiếp theo chứa 2 số nguyên dương là mul và seed.
Lưu ý: 30% số test T <= 50. 
Nguyên tắc sinh dãy A với A[i] là chỉ số trung bình của thành viến thứ i như sau:
A[1] = (mul*seed  + seed)  mod maxC.
A[i]  = (A[i-1]*mul + seed) mod maxC.
a mod b là phép lấy phần dư của phép chia a cho b.

0 <= mul, seed <= 106.
maxC = 220.
Kết quả ra: Gồm một dòng chứa mốt số nguyên là kết quả bài tốn.
Ví dụ:
Dữ liệu
Kết quả
4 2 2 89133
50886
 3 6

Thuật tốn
Đề bài phát biểu rất đáng sợ, tuy nhiên có thể rút gọn cịn các vấn đề sau:
Cho 4 số

Trong đó,
Cho dãy
Tính:

số

với

.

14

download by :


Đầu tiên nhận thấy


có thể lên tới

nên khơng thể tính thẳng

mà không bị tràn số nguyên như khi

. Sử dụng thuật tốn nhân đơi liên tiếp

(tương tự như tính luỹ thừa nhanh) có thể tính tới

nhưng lại mất độ phức tạp

, sẽ làm chương trình chạy rất chậm. Rất may có cách để tính
trong O(1) trong trường hợp

. Cách làm đơn giản là viết

. Khi đó thì

có:
.

Các phép nhân bây giờ chỉ là nhân một số

với 1 số

, kết quả bé hơn

nên có thể tính chính xác bằng số 64 bit.

Vì giá trị

khơng phụ thuộc vào chỉ số i mà chỉ phụ thuộc vào giá trị của

nên có thể đếm phân phối để rút gọn bài tốn về tính
sẽ cho rằng cần phải tính n=

giá trị. Từ đây lời giải

giá trị

Chia bài tốn làm 2 phần để dễ xử lí. Nếu

thì có thể thoải mái duyệt

tính từng giá trị để tính. Nếu khơng ta có:

là một hàm nhân tính hồn tồn,

nên thực tế ta chỉ cần tính
với là một số ngun tố. Khi là một số ngun tố thì
có 2 trường hợp sau:

ngun tố cùng nhau thì áp dụng tính chất hàm phi Euler
sẽ

tính

nếu biết


trong
với

trong

.

là một thừa số nguyên tố của
. Nhận thấy là

được
. Gọi

là số nguyên dương lớn nhất mà

mà số mũ lớn nhất của một thừa số nguyên tố nào đó

chỉ là

nên

. Vì

ngun tố cùng nhau

nên có thể dùng hàm phi Euler tính
nếu biết

để tính kết quả
Phân tích


)

trong

. Sử dụng định lí phần dư Trung Hoa

mất
ra thừa số ngun tố thì tính trước được



với các thừa số . Có ít hơn log2(base) thừa số ngun tố trong
phân tích độ phức tạp

nên nếu dùng thuật

thì điều này sẽ tính được trong

.

Tổng hợp lại, có các việc cần làm là phân tích base ra thừa số nguyên tố và tính
trước các giá trị hàm phi Euler cần thiết mất O(
, sàng nguyên tố và lưu lại ước
nguyên tố bé nhất mất

tính hàm cho các số nguyên tố mất
, tính cho các hợp số và cộng kết quả mất

độ phức tạp có thể được đánh giá bằng


.

15

download by :

. Vậy


Test và Cảm nhận
Có thể chấm bài tại đây />Bài VOSPOW yêu cầu học sinh phải nắm rõ về hàm nhân tính, hàm phi Euler, định lí
phần dư Trung Hoa, sàng nguyên tố cũng như biết cách tính mod cho "số lớn" nhanh để
có thể cài đặt được thuật tốn có thời gian chạy tốt.
2.4. Hiệu quả của sáng kiến kinh nghiệm đối với hoạt động giáo dục, với
bản thân, đồng nghiệp và nhà trường
Sáng kiến kinh nghiệm trên đây đã được tôi áp dụng giảng dạy cho đội tuyển học
sinh giỏi quốc gia môn tin học của tỉnh Thanh Hóa năm học 2017 – 2018, 2018 – 2019.
Học sinh nắm bắt lí thuyết và đã áp dụng để giải được nhiều bài tập về tính tốn đồng dư
trong phần bài tập áp dụng, cũng như các kì thi mà học sinh tham gia: các trang giải bài
tập online judge (spoj, codeforce, hackerrank, atcoder, codechef,...); các kì thi online
(free contest, codeforce, PreVOI,...) Thành tích thi học sinh giỏi quốc gia, quốc tế của đội
tuyển Tin Thanh Hóa có cải thiện. Trong hai năm cả đội có 1 giải Nhất, 1 giải Nhì, 2 giải
ba, 7 giải khuyến khích; 01 huy chương bạc Châu Á; 01 học sinh dự thi quốc tế.

3. Kết luận, kiến nghị
Sáng kiến kinh nghiệm này là đúc rút từ bản thân tơi trong q trình dạy học cho
đối tượng học sinh giỏi chuẩn bị thi quốc gia. Vì tài liệu viết về tính tốn đồng dư phục
vụ giải quyết các bài toán số học trong lập trình thi đấu chưa nhiều, chủ yếu lại viết bằng
tiếng Anh từ các nguồn trên internet. Tôi hi vọng, đây sẽ là tài liệu thực sự hữu ích cho

các đồng nghiệp, tổ chuyên môn trong việc dạy học bồi dưỡng học sinh giỏi tin học trong
những năm tiếp theo.

16

download by :


Tài liệu tham khảo
[1] Wikipedia, Định lí cơ bản của số học,
/>%E1%BA%A3n_c%E1%BB%A7a_s%E1%BB%91_h%E1%BB%8Dc
[1] Wikipedia, Dirichlet Convolution
/>[3] Wikipedia, Prime number theorem
/>[4] Wikipedia, Định lí nhỏ Ferma
/>%8F_Fermat
[5] Wikipedia, Giải thuật Euclid mở rộng
/>%E1%BB%9F_r%E1%BB%99ng

17

download by :



×