Phân tích giải thuật bài toán phân tích số
Trang 1Các bài toán phân tích số
Cao Minh Anh
Trong quá trình học chắc các bạn sẽ gặp rất nhiều các bài toán về phân tích số Các bài này có rất nhiều dạng khác nhau Sau đây tôi xin đề cập đến một số bài toán để cùng trao đổi với các bạn
Bài 1: Cho số nguyên dương M(M<=232),tìm cách phân tích M ra các số nguyên dương khác nhau có tổng bằng M sao cho tích của chúng là lớn nhất
Trang 2+ Bây giờ ta tưởng tượng ta đang có d hạt đậu, chúng ta bắt đầu rải từng hạt đậu vào các a[I](1<=I<=k) theo chiều từ k1 Nếu rải đến 1 mà vẫn còn thì ta vẫn rải lại bắt đầu từ k lại,cứ như thế cho đến khi không còn hạt đậu nào Khi rải đậu đến ô nào thì tăng giá trị của ô đó lên
Sau đó xuất mảng a[i] ra là giải quyết xong bài toán
Xong trên chỉ là tư tưởng của thuật toán trên, nếu làm theo cách đó thì ta sẽ tốn nhiều thờigian và dữ liệu Sau đây tôi xin giới thiệu một cách cài đặt giúp tăng thời gian và giảm dửliệu:
Ở bước một ta tìm K lớn nhất cho a[1]+a[2]+ +a[k]<=M
+ Giải phương trình:2+3+4+ +(k-1)<=M
<-> k(k-1)/2 <=M-1
Giải phương trình trên tìm nghiệm k nguyên trong khoảng nghiệm là được
Bước hai: Thay vì mỗi lần ta rãi 1 hạt, mà ta rải (d div k) hạt đậu từ a[k]àa[1] (Với d là sốhạt đậu còn lại, k là số ô để ta bỏ đậu vào), sau đó sẽ còn dư (d mod k) ta lại rải lại từ cuối đến đầu Như vậy chỉ mất 2 lần
Trang 4du:=M+1-(k*(k+1) div 2);end;
Trang 5Với cách làm trên ta có thể xử lý rất nhanh,vừa đỡ dữ liệu.Sau đây là một bài khác.
Bài 2: Phân tích số đòi hỏi đưa ra tất cả các cách có thể có.
+Với những bài như trên thì dữ liệu vào sẽ nhỏ,và phương pháp đơn giản nhất là duyệt
Ví dụ: Cho một số n.Hãy đưa ra tất cả các cách phân tích n ra các số nguyên tố có thể
giống nhau sao cho tổng của chúng bằng n
Trang 6If n mod i=0 then exit;
Trang 7Từ bài trên có thể chuyển qua rất nhiều bài như sau:
+Phân tích n ra các số nguyên tố khác nhau
Trang 8Bài toán: Cho một số n<=2000 hãy tìm số cách phân tích n thành các số nguyên tố có thể giống nhau sau cho tổng của chúng bằng n.
Khởi tạo: Fx[i]=1 nếu i là số nguyên tố
Khi xét các số nguyên tố p từ 2 n thì ta luôn có:
Trang 9var n,k,dem :longint;
Fx :array[0 2000] of ^arr;Donvi :arr;
Trang 11for i:=2 to n do
if nto(i) then
begin
Cong(Fx[i]^,donvi,Fx[i]^);for j:=i+2 to n do
Cong(Fx[j]^,Fx[j-i]^,Fx[j]^);end;
Trang 13+Dạng 2: Với lớp bài toán phân tích n ra các số (hay nguyên tố) có thể giống nhau nhưng
Trang 14Gọi Fx[i] là số cách tạo thành i;
Khởi tạo:Fx[i]=1 với 1<=i<=n
Vì lặp lại vẫn được nên ta có công thức sau:
For h:=1 to n-i do
Fx[i+h]:=Fx[i+h]+Fx[i];
Tổng quan như sau:
For i:=1 to n do fx[i]:=1;
type arr=array[1 200] of byte;
var n,k,dem :longint;
Trang 16var i,du :integer;
Trang 20Ví dụ:
N=5 có 3 cách là:
Trang 211 4
2 3 5