đề bài:cho mảng số nguyên dương a[] gồm n số.tìm tất cả các số nguyên dương k sao cho các phần tử trong a[] lấy phần dư với k đều bằng nhau.Anh chị giúp em với ạ.Em cám ơn nhiều
Tìm tất cả các số nguyên dương k sao cho các phần tử trong mảng a lấy phần dư với k đều bằng nhau
Bạn sử dụng 2 vòng for lồng nhau.
for1: cho k chạy từ 1 -> min của mảng a[]
Gán 1 biến phần dư = a[0] % k;
for2: cho i chạy từ 1 -> n
Bạn kiểm tra nếu có bất kỳ a[i] % k != phần dư thì break luôn,
nếu bằng thì tăng biến đếm lên 1.
Hết vòng for2: kiểm tra đếm có bằng n-1 không? có thì k chính là 1 giá trị k cần tìm, tiếp tục vòng for1 cho tới hết bạn sẽ thu được tất cả k.
mình làm được rồi.cám ơn bạn nhé
gcd(|a[i] - a[j]|) 0<i<j<n
là sao vậy bạn.bạn nói rõ hơn được không
@giang3: Lần sau nếu bạn đã làm được thì hãy đăng code/ý tưởng của bạn lên nữa, thay vì chỉ hỏi mỗi đề bài thôi nhé.
xin lỗi nhưng mình không làm được ý. nhờ ý tưởng của bạn cmt trên thì mình làm được rồi
lỡ n số trong a bằng nhau thì thế nào :V
Nếu lỡ chọn a[i] = a[j] = a[k] thì d = a[i]
thì kq k = {1, 2, 3…a}
Cách này hình như k chạy được với trường hợp n < 3, với trường hợp a[i] = a[j] | a[j] = a[k]
update: à. ok
Với bạn có thể giải thích giúp thuật toán: tại sao chọ d = gcd(|a[i] - a[j]|, |a[j] - a[k]|)
k vậy? thanks
Vì a[i] = a[j] (mod d) <=> a[i] - a[j] = 0 (mod d) <=> (a[i] - a[j]) chia hết cho d, vậy lấy ước chung lớn nhất của các hiệu để khởi tạo.
ờ ha, bạn nói & thử mới thấy 2 cái này tương đương. Không ngờ hay vậy luôn (y)
thanks
Để tìm gcd(|a[i] - a[j]|), 0 < i < j < n
ta chỉ cần tìm gcd(|a[i+1] - a[i]|, i = 1..n-1
, do d | k <=> d | (-k)
, tính kết hợp và tính chất gcd(a, b) = gcd(a, a+b)
.
nma sao lại là ucln của hiệu mà không phải lấy ucln của dãy số luôn vậy