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
Để 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.
guyê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 PASS.OUT 12 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ố đó. 26 const fi = 'pass.inp'; fo = 'pass.out'; var f,g : text; p : array[0..1001] of boolean; procedure xuly; var d, n,kk,j,k,i,s:longint; Begin fillchar(p,sizeof(p),true); k:=0;s:=0; readln(f,n); for i:=2 to n do if n mod i =0 then begin if (p[i]) then begin inc(k); s:=s+i; for j:=1 to (n div i) do p[j*i]:=false; end; end; writeln(g,k,' ',s ) end; Begin assign(f,fi); assign(g,fo); reset(f); rewrite(g); Begin xuly; end; close(g); end. Bài 3. Số gần hoàn hảo 27 Một số nguyên dương N được gọi là số "gần hoàn hảo" nếu thỏa mãn điều kiện: 2* N ≤ A, với A là tổng các ước số của N. Chẳng hạn: 12 là một số "gần hoàn hảo" vì: 2*12 < 1+2+3+4+6+12. Yêu cầu: Với K số nguyên dương, hãy kiểm tra xem các số nguyên dương đó có phải là số "gần hoàn hảo" hay không? Dữ liệu vào: Từ tệp GHH.INP có cấu trúc như sau: - Dòng đầu tiên chứa số nguyên dương K (K ≤ 100). - Dòng thứ hai chứa K số nguyên dương A1, A2,, AK (Ai ≤ 109 với 1≤ i ≤ K). Dữ liệu ra: Ghi vào tệp GHH.OUT gồm K dòng, dòng thứ i ghi số 1 nếu Ai là số "gần hoàn hảo", ngược lại ghi số 0. Ví dụ: GHH.INP GHH.OUT 3 6 16 12 1 0 1 Ràng buộc: Subtask 1: Có 60% điểm tương ứng với trường hợp Ai ≤ 106 với 1≤ i ≤ K. Hướng dẫn: Ta phân tích các số nguyên dương N thành tích các thừa số nguyên tố, sau đó áp dụng công thức để tính tổng các ước của nó. Để thuật toán nhanh hơn có thể áp dụng sàng số nguyên tố. Chương trình: const fi='GHH.INP'; fo='GHH.OUT'; maxn=100000; Var A:array[1..maxn] of longint; gt,gtmu:array[1..maxn] of longint; K:longint; procedure docdl; var f:text; 28 i:longint; Begin assign(f,fi); reset(f); readln(f,k); For i:=1 to k do read(f,a[i]); close(f); end; Function lt(x,n:longint):int64; Var i:longint; t:int64; Begin t:=1; For i:=1 to n do t:=t*x; exit(t); end; Function tonguoc(x:longint):int64; Var y,i,k,sl:longint; s:int64; Begin y:=trunc(sqrt(x)); sl:=0; i:=2; k:=0; repeat while x mod i 0 do begin inc(i); k:=0; end; inc(k); x:=x div i; if x mod i0 then Begin inc(sl); 29 gt[sl]:=i; gtmu[sl]:=k; end; until (i>y) or (x=1); if x1 then Begin inc(sl); gt[sl]:=x; gtmu[sl]:=1; end; s:=1; For i:=1 to sl do s:=s*((lt(gt[i],gtmu[i]+1)-1) div (gt[i]-1)); exit(s); end; Function ghh(x:longint):boolean; Begin if tonguoc(x)>=2*x then exit(true); exit(false); end; Procedure ghikq; Var f:text; i:longint; Begin Assign(f,fo); rewrite(f); for i:=1 to k do if ghh(a[i]) then writeln(f,1) else writeln(f,0); close(f); 30 end; BEGIN Docdl; ghikq; END. Bài 4. Số nguyên tố tốt nhất Nói số a tốt hơn b nếu tổng bình phương các chữ số của a (trong hệ cơ số 10) lớn hơn tổng bình phương các chữ số của b hoặc các tổng này bằng nhau nhưng a < b. Yêu cầu: Cho hai số nguyên l và r (2 ≤ l ≤ r ≤ 50 000). Hãy tìm số nguyên tố tốt nhất trong khoảng [l, r]. Nếu trong khoảng này không có số nguyên tố nào thì đưa ra số -1. Input: Một dòng chứa hai số l, r Output: Kết quả tìm được Ví dụ: NTTOTNHAT.INP NTTOTNHAT.OUT 2 28 19 Thuật toán: - Tính tổng bình phương các chữ số của a, b - Dùng sàng nguyên tố để lọc ra các số lớn hơn hoặc bằng l và bé hơn hoặc bằng r. Chương trình: const tfi='nttotnhat.inp'; tfo='nttotnhat.out'; var m, n: longint; NT: array[0..50001] of longint; procedure SangNT; var i,j: longint; 31 begin NT[1]:=1; i:=1; repeat repeat inc(i) until (i>trunc(sqrt(n))) or (nt[i]=0); if i<=trunc(sqrt(n)) then begin j:=2; while j*i<=n do begin nt[j*i]:=1; inc(j); end; end; until i>trunc(sqrt(n)); end; function TongBP(x: longint): longint; var s: string; t, i: longint; begin str(x,s); t:=0; for i:=1 to length(s) do t:=t+sqr(ord(s[i])-48); exit(t); end; procedure main; var i,ds, max,t: longint; begin assign(input,tfi); reset(input); assign(output,tfo); rewrite(output); read(m,n); 32 sangNT; max:=0; ds:=-1; for i:=m to n do if nt[i]=0 then begin t:=TongBP(i); if (max=0) or (t>max) then begin max:=t; ds:=i; end; end; writeln(ds); close(input); close(output); end; BEGIN main; END. Bài 5. Vòng số nguyên tố Một vòng tròn chứa 2*n vòng tròn nhỏ. Các vòng tròn nhỏ được đánh số từ 1 đến 2*n theo chiều kim đồng hồ. Cần điền các số tự nhiên từ 1 đến 2*n mỗi số vào một vòng tròn nhỏ sao cho tổng của hai số trên hai vòng tròn nhỏ liên tiếp là số nguyên tố. Số điền ở vòng tròn nhỏ 1 luôn là số 1. Input Số nguyên dương n ( 1 < n < 10 ) . Output Dòng đầu tiên ghi ra số k là số cách tìm được. K dòng tiếp theo mỗi dòng ghi ra 1 cách điền các số vào các vòng tròn nhỏ. Cách điền nào có thứ tự từ điển nhỏ hơn thì xếp trước. Nếu K > 10000 thì chỉ cần ghi ra 10000 cách đầu tiên. Ví dụ 33 Input: 4 Output: 4 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 Thuậ toán: - Viết sẳn thủ tục sàng số nguyên tố - Áp dụng thuật toán quay lui để chọn các số, kiểm tra điều kiện dựa trên mảng sàng SNT. – Vì N<10 nên có thể tính trước kết quả K và bỏ vào mảng hằng chỉ việc xuất ra. Giúp tiết kiệm được bộ nhớ và thời gian khi quay lui. Chương trình: const fi=''; fo=''; nmax=10; type data=longint; var f:text; SNT:array[1..50] of boolean; n:data; DD:array[1..nmax*2] of boolean; KQ:array[1..nmax*2] of byte; sl:data; LUUTRU:array[1..16000020] of byte; spt,k:longint; procedure sangnt; var i,j:data; 34 begin fillchar(snt,sizeof(snt),true); i:=2; snt[1]:=false; while i<=sqrt(50) do begin while snt[i]=false do inc(i); for j:=2 to 50 div i do snt[i*j]:=false; inc(i); end; end; procedure init; begin fillchar(dd,sizeof(dd),false); dd[1]:=true; sl:=1; kq[1]:=1; spt:=0; k:=0; end; procedure xuli; var i:data; begin if not snt[1+kq[sl]] then exit; inc(k); for i:=1 to sl do begin inc(spt); LUUTRU[spt]:=kq[i]; 35 end; end; procedure try; var j:data; begin if sl=2*n then begin xuli; end else for j:=2 to 2*n do if (not dd[j]) and (SNT[kq[sl]+j]) then begin dd[j]:=true; inc(sl); kq[sl]:=j; try; dd[j]:=false; dec(sl); end; end; procedure xuat; var i,tam:data; begin assign(f,fo); rewrite(f); writeln(f,k); if k>10000 then tam:=10000*2*n else 36 tam:=k*2*n; for i:=1 to tam do begin write(f,luutru[i],' '); if i mod (2*n) = 0 then writeln(f); end; close(f); end; begin assign(f,fi); reset(f); readln(f,n); close(f); SANGNT; init; try; xuat; end. Bài 6. Số chính phương Bờm rất thích các số chính phương, muốn tìm hiểu về nó, và biết rằng số chính phương cũng được biểu diễn bằng tích của một tập các số tự nhiên phân biệt. Chẳng hạn: 9 = 1 9; 144 = 2 3 4 6. Bờm hay ngẫm nghĩ về nó mọi lúc khi có thời gian rãnh. Hôm nay, giờ giải lao trên lớp, Bờm quay sang đố Tuấn, với số tự nhiên N cho trước thì số chính phương lớn nhất được biểu diễn bằng tích của một tập các số tự nhiên phân biệt từ 1 đến N là bao nhiêu? Tuấn suy nghĩ mãi mà chưa trả lời được câu đố và thời gian thì ít quá. Yêu cầu: Cho một số nguyên N, hãy giúp Tuấn đưa ra số chính phương lớn nhất là tích của một tập các số tự nhiên phân biệt từ 1 đến N. Số đó có thể rất lớn nên chỉ cần xuất ra phần dư khi chia số đó cho 1000000007. Dữ liệu: Từ file văn bản SOCP.INP có cấu trúc: Một dòng duy nhất chứa số nguyên dương N. (N ≤ 4.104) 37 Kết quả: Ghi vào file văn bản SOCP.OUT có cấu trúc: Một dòng duy nhất là kết quả bài toán sau khi đã mod 1000000007 Ví dụ SOCP.INP SOCP.OUT 5 4 Subtask 1 (2 điểm): Giả thiết N≤ 102 . Subtask 2 (2 điểm): Giả thiết N≤ 103 . Subtask 3 (2 điểm): Giả thiết N≤ 4.104 . Thuật toán: - Phân tích số N! thành tích các thừa số nguyên tố, ghi nhận số lượng mỗi số bằng cách dùng sàng nguyên tố. Giả sử các thừa số đó là P1, P2, , Pk với các số mũ tương ứng là a1, a2, , ak. - Nếu ai lẻ thì giảm ai một đơn vị với mọi i = 1, 2, , k - Số chính phương lớn nhất cần tìm là tích các thừa số nguyên tố của các các số nguyên tố có số mũ chẵn lớn hơn 0. Chú ý khi tính ta mod với 1000000007 Chương trình: const fi='SOCP.INP'; fo='SOCP.OUT'; max=10000000; K=1000000007; var p,a:array[1..max] of longint; NT:array[1..max] of boolean; m,n,d:longint; kq:int64; f:text; Procedure Doc; begin assign(f,fi); reset(f); readln(f,n); close(f); end; 38 Procedure Sang; var i,j:longint; begin for i:=1 to n do nt[i]:=true; nt[1]:=false; d:=0; for i:=2 to n do if nt[i] then begin inc(d); P[d]:=i; for j:=2 to n div i do nt[i*j]:=false; end; end; FUNCTION mu(a,x:longint):int64; var t:int64; begin if x=1 then exit(a); t:=mu(a, x div 2); t:=(t*t) mod k; if x mod 2 0 then t:=(t*a) mod k; exit(t); end; procedure xuly; var s,tg,i:longint; begin for i:=1 to d do begin tg:=p[i]; s:=0; while tg<=n do begin s:=s+ n div tg; 39 tg:=tg*p[i]; end; a[i]:=s; end; kq:=1; for i:=1 to d do begin if odd(a[i]) then dec(a[i]); if a[i]>0 then kq:=(kq*mu(p[i],a[i])) mod k; end; end; procedure ghi; begin assign(f,fo); rewrite(f); writeln(f,kq); close(f); end; begin doc; sang; xuly; ghi; end. 40 Dạng 3: Phân tích thành các số nguyên tố Bài 1. Phân tích Cho số tự nhiên 2 n 105. Hãy phân tích n! ra tích của các thừa số nguyên tố theo trật tự tăng dần. Thí dụ, 4! = 23.31. Dữ liệu vào từ tệp văn bản PHANTICH.INP chỉ có một dòng chứa số tự nhiên n. Kết quả ghi ra tệp văn bản PHANTICH.OUT gồm các dòng, mỗi dòng ghi một thừa số nguyên tố tiếp đến là số mũ tương ứng. Các số trên cùng dòng cách nhau qua dấu cách. PHANTICH.INP PHANTICH.OUT 4 2 3 3 1 Chương trình: const fi='PHANTICH.INP'; fo='PHANTICH.OUT'; var n, dem, k:longint; p, x: array[1..100000] of int64; procedure readfile; var f:text; begin assign(f,fi); reset(f); readln(f,n); close(f); end; function nt(n: longint):boolean; var i: integer; begin if n=1 then exit(false); if n<4 then exit(true); for i:=2 to trunc(sqrt(n)) do if n mod i=0 then exit(false); 41 exit(true); end; function sk(n:longint; p: longint): longint; var tam:longint; begin tam:=0; while n>=p do begin inc(tam,n div p); n:=n div p; end; sk:=tam; end; procedure xuly; var i, y: longint; begin for i:=2 to n do if nt(i) then begin inc(dem); p[dem]:=i; x[dem]:=sk(n,i); end; end; procedure inkq; var f:text; i:integer; begin assign(f,fo); rewrite(f); for i:=1 to dem do writeln(f,p[i],' ',x[i]); close(f); 42 end; BEGIN readfile; xuly; inkq; END. Bài 2. Biểu diễn số Cho một số nguyên k, hãy tìm cách biểu diễn k thành tổng 3 số nguyên tố đôi một khác nhau. Dữ liệu : Vào từ file văn bản PRIME.INP chứa duy nhất 1 số là k (15<=k<=2.000.000.000). Kết quả : Ghi ra file văn bản PRIME.OUT gồm 3 số nguyên tố đôi một khác nhau và có tổng là k. Ví dụ : PRIME.INP PRIME.OUT 15 3 5 7 Chương trình: const fi ='prime.inp'; fo ='prime.out'; var n,m,k :longint; f,g :text; procedure ndl; begin readln(f,n); end; function ktnt(x:longint):boolean; var l:longint; begin ktnt:=false; 43 for l:=2 to trunc(sqrt(x)) do if x mod l= 0 then exit; ktnt:=true; end; procedure cb; begin if n mod 2 =0 then k:=2 else k:=3; end; procedure xuli; var i:longint; begin for i:=2 to n-2 do if ktnt(i) then if ktnt(n-k-i) then begin write(g,k,#32,i,#32,n-i-k); writeln(g); exit; end; end; BEGIN assign(f,fi); reset(f); assign(g,fo); rewrite(g); while not seekeof(f) do begin ndl; cb; 44 xuli; end; close(f); close(g); END. Bài 3. Dãy nguyên tố Cho số tự nhiên k và dãy A gồm N (N < 104) số tự nhiên không vượt quá 32000. Yêu cầu: Tìm k số nguyên tố nhỏ nhất khác nhau xuất hiện trong dãy A. Dữ liệu vào từ file văn bản DAYNT.INP: Dòng đầu tiên chứa một số tự nhiên k (1< k < N). N dòng tiếp theo, mỗi dòng chứa một số tự nhiên là một phần tử của dãy A. Kết quả ghi ra file văn bản DAYNT.OUT: Đưa ra trên cùng một dòng k số nguyên tố tìm được theo thứ tự tăng dần, các số cách nhau ít nhất một ký tự trống. Lưu ý: Dữ liệu vào đảm bảo luôn tìm được k số nguyên tố thỏa mãn. Ví dụ: DAYNT.INP DAYNT.OUT 3 12 13 6 17 9 3 1 12 3 13 17 Chương trình: CONST fi = 'DayNT.inp'; fo = 'DayNT.out'; 45 Var D : Array[2..32000] of byte; i,n,k,a : integer; Procedure mofile; begin assign(input,fi); reset(input); assign(output,fo); rewrite(output); end; Function Nto( n : integer): boolean; var i :integer; begin if n<2 then exit(false) else for i:=2 to trunc(sqrt(n)) do if n mod i =0 then exit(false); exit(true); end; Procedure Doc_xuly; begin readln(k); for i :=1 to 32000 do d[i] :=0; while not seekeof do begin readln(a); if nto(a) then d[a] :=1; end; end; Procedure xuat; begin n:=0; 46 for i :=1 to 32000 do if d[i] 0 then begin write(i,' '); n := n+1; if n = k then exit; end; end; Begin mofile; Doc_xuly; xuat; end. Bài 3. Phân tích số Với số nguyên dương x, gọi f(x,k) là số cách phân tích số x thành tổng các số nguyên tố mà mỗi số nguyên tố có trong tổng không quá k lần. ví dụ f(12,3) =5 vì có 5 cách phân tích: 12 = 2 + 2 + 2 + 3 + 3; 12 = 2 + 2 + 3 + 5; 12 = 2 + 3 + 7; 12 = 2 + 5 + 5; 12 = 5 + 7 f(12,1) =2 vì có 2 cách phân tích 12 = 2 + 3 + 7; 12 = 5 + 7 Cho một dãy số nguyên dương a1,a2,,aN và số nguyên dương k( 1≤ N,k ≤ 100). Hãy tính các f(ai,k) (với mọi i=1,2,,N). Dữ liệu vào: Từ file văn bản KSNT.INP. có cấu trúc như sau: Dòng đầu tiên ghi 2 số nguyên dương theo thứ tự N, k. Dòng thứ 2 ghi N số nguyên dương a1, a2,, aN.( 1 < aI ≤ 100) Kết quả: Ghi ra file văn bản KSNT.OUT, gồm N số nguyên viết trên một dòng, số thứ i là f(ai,k). Cả 2 file dữ liệu thứ tự các số trên một dòng tính từ trái qua phải và cách nhau một dấu cách. Ví dụ: 47 KSNT.INP KSNT.OUT 5 6 15 8 9 23 47 12 3 4 35 414 Chương trình: const tfi='KSNTO.INP'; tfo='KSNTO.OUT'; maxMN=100; NTO: array[1..25] of integer=( 2, 3, 5, 7,11,13,17,19,23,29, 31,37,41,43,47,53,59,61,67,71, 73,79,83,89,97); var fi,fo: text; M,N,k: integer; a: array[1..100] of integer; x,y: array[0..100] of real; procedure Docdl; var i,j: integer; begin readln(fi,n,k); for i:=1 to N do read(fi,a[i]); end; procedure ChuanBi; var i,j,l: integer; begin for i:=0 to 100 do x[i]:=0; {khong xac dinh} for j:=0 to k do begin 48 if j*NTO[1]>100 then break; x[j*NTO[1]]:=1; end; for l:=2 to 25 do begin y:=x; for i:=1 to 100 do begin x[i]:=0; for j:=0 to k do begin if i-j*NTO[l]<0 then break; x[i]:=x[i]+y[i-j*NTO[l]]; end; end; end; end; procedure Inkq; var i,j: integer; begin for i:=1 to N do write(fo,x[a[i]]:0:0,' '); end; BEGIN assign(fi,tfi); reset(fi); assign(fo,tfo); rewrite(fo); Docdl; ChuanBi; Inkq; close(fi); close(fo); 49 END. Bài 5. Số ước Cho số nguyên dương N. Giai thừa của N, kí hiệu là N!, là tích của các số tự nhiên từ 1 đến N. Gọi T là số lượng ước lớn hơn 1 của N!. Ví dụ với N = 4, ta có 4! = 24. Như vậy 4! có 7 ước lớn hơn 1 là: 2, 3, 4, 6, 8, 12, 24. Yêu cầu: Cho N, hãy xác định T. Dữ liệu: Vào từ file văn bản DIVISORS.INP trong đó chứa duy nhất số N (N 20, trong đó 50% số test có N10). Kết quả: Ghi ra file văn bản DIVISORS.OUT số T tìm được. Ví dụ: DIVISORS.INP DIVISORS.OUT 4 7 Hướng dẫn: Nếu một số nguyên m được phân tích ra thừa số nguyên tố dưới dạng m=p1a1p2a2...pkak thì số ước số của m bằng tích (a1+1)(a2+1)...(ak+1). Ta sẽ tìm cách phân tích n! ra thừa số nguyên tố. Các ước số nguyên tố của n! chỉ nằm trong phạm vi từ 2 đến n, do đó ta duyệt qua tất cả các số nguyên tố trong phạm vi này. Với số nguyên tố p, số mũ của nó trong biểu diễn nguyên tố của n! bằng: [n/p] + [n/p2] + [n/p3] + ... Trong đó [n/p] ký hiệu phần nguyên của n/p, nói cách khác trong ngôn ngữ Pascal [n/p] bằng n div p. Công thức trên được giải thích như sau: [n/p] là số lượng số từ 1 đến n chia hết cho p, [n/p2] là số lượng số từ 1 đến n chia hết cho p2,... mỗi số này đều đóng góp một thừa số nguyên tố p phân biệt cho n!. Chương trình: const fi='DIVISORS.INP'; fo='DIVISORS.OUT'; 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; 50 nguyento:=true; end; var n,i,j,a,d: longint; f:text; begin assign(f,fi); reset(f); readln(F,n); d:=1; for i:=2 to n do if nguyento(i) then begin a:=0; j:=i; while (j<=n) do begin a:=a+n div j; j:=j*i; end; d:=d*(a+1); end; close(f); assign(f,fo); rewrite(f); writeln(f,d-1); close(f); end. 51 KẾT QUẢ ÁP DỤNG Nội dung của đề tài là tập hợp các kiến thức thuật toán về số nguyên tố và vận dụng nó trong việc giải một số bài toán mà tác giả đã tích lũy được trong nhiều năm giảng dạy. Đề tài này đã được áp dụng giảng dạy ở các lớp chuyên Tin, các lớp không chuyên tại trường THPT chuyên Phan Bội Châu; đồng thời cũng chia sẻ, trao đổi với một số giáo viên các trường THPT của tỉnh Nghệ An và đã thu được kết quả tốt. Các em học sinh học tập tích cực hơn, hứng thú hơn và đạt kết quả cao trong học tập cũng như trong các kỳ thi HSG môn Tin học. KẾT LUẬN Trên đây là những kinh nghiệm mà tôi đã nghiên cứu vận dụng trong quá trình giảng dạy thực tế. Thông qua một số bài tập trên, học sinh được rèn luyện cách vận dụng các thuật toán về số nguyên tố để giải các bài toán. Từ đó các em có những kinh nghiệm vận dụng linh hoạt một thuật toán rất cơ bản vào từng bài toán cụ thể. Để đề tài của tôi được hoàn thiện hơn, việc sử dụng đạt hiệu quả cao hơn, tôi rất mong các thầy cô và các đồng nghiệp đóng góp ý kiến để việc giảng dạy trong nhà trường ngày càng hiệu quả hơn, giúp các em học sinh học tốt hơn. Tôi xin chân thành cảm ơn! Vinh, ngày 02 tháng 4 năm 2019 Tác giả Phạm Thị Thu Hường 52 TÀI LIỆU THAM KHẢO 1. Hồ Sĩ Đàm - Hồ Cẩm Hà - Trần Đỗ Hùng - Nguyễn Đức Nghĩa - Nguyễn Thanh Tùng - Ngô Ánh Tuyết. Tin học 11 (Sách giáo khoa) - NXB Giáo dục. 2. Hồ Sĩ Đàm - Hồ Cẩm Hà - Trần Đỗ Hùng Nguyễn Đức Nghĩa – Nguyễn Thanh Tùng - Ngô Ánh Tuyết. Tin học 11 (Sách giáo viên) - NXB Giáo dục. 3. Hồ Sĩ Đàm - Nguyễn Thanh Tùng - Ngô Ánh Tuyết. Tin học 11 (Sách bài tập) - NXB Giáo dục. 4. Hồ Sĩ Đàm – Đỗ Đức Đông - Lê Minh Hoàng - Nguyễn Thanh Hùng. Tài liệu chuyên Tin học (Quyển 1, 2) - NXB Giáo dục. 5. Bài giảng của Lê Minh Hoàng – ĐHSP Hà nội. 6. Một số đề thi chọn HSG THPT, đề thi Trại hè Hùng Vương, 7. Bài tập trên https://vn.spoj.pl/problem
File đính kèm:
- video_73.pdf