Mỗi bộ dữ liệu cho hai điều kiện về số dư của cùng một số nguyên: xmodn=a và xmodm=b. Hai mô-đun có thể có ước chung.
Nếu không có số nguyên nào thỏa đồng thời hai điều kiện, hãy thông báo không có nghiệm. Nếu có, đặt K=lcm(n,m) và in nghiệm chuẩn x trong đoạn 0≤x<K; toàn bộ nghiệm khi đó là x+qK với q nguyên.
Input
Dòng đầu chứa T. Mỗi dòng trong T dòng tiếp theo chứa bốn số anbm.
Output
Với mỗi bộ dữ liệu, in no solution nếu vô nghiệm; nếu có nghiệm, in xK, trong đó K=lcm(n,m) và 0≤x<K.
Constraints
1≤T≤1000.
0≤a<n,0≤b<m.
1≤n,m≤109.
Scoring
Subtask 1 (50% số điểm):T≤3,n≤6 và m≤8.
Subtask 2 (50% số điểm): không có giới hạn bổ sung.
Example
Test 1
Input
2
2 4 6 8
1 2 0 4
Output
6 8
no solution
Giải thích: Ở bộ đầu, các số hợp lệ tạo lớp 6 theo chu kỳ 8. Ở bộ thứ hai, một số không thể vừa lẻ theo mô-đun 2 vừa chia hết cho 4, nên hệ vô nghiệm.
Lời giải tóm tắt
Mô hình: Mỗi bộ dữ liệu cho hai điều kiện về số dư của cùng một số nguyên: x mod n = a và x mod m = b. Hai mô-đun có thể có ước chung.
Mô hình: Nếu không có số nguyên nào thỏa đồng thời hai điều kiện, hãy thông báo không có nghiệm. Nếu có, hãy in nghiệm không âm nhỏ nhất x và mô-đun chung K; toàn bộ nghiệm khi đó là x + qK với q nguyên.
Thuật toán: Đặt x=a+n*t. Điều kiện còn lại trở thành:
Thuật toán: n*t ≡ b-a (mod m).
Thuật toán: Gọi g=gcd(n,m). Đồng dư tuyến tính trên có nghiệm khi và chỉ khi g | (b-a). Nếu không chia hết, hệ vô nghiệm.
Thuật toán: Khi chia hết, rút gọn:
Thuật toán: (n/g)*t ≡ (b-a)/g (mod m/g).
Thuật toán: Hai số n/g và m/g nguyên tố cùng nhau, nên lấy nghịch đảo của n/g modulo m/g. Từ đó tìm t nhỏ nhất không âm, tính x=a+nt, rồi chuẩn hóa theo K=lcm(n,m)=n/gm.
Chứng minh đúng đắn: Điều kiện cần: từ nt = (b-a)+mq suy ra g chia b-a. Điều kiện đủ: nếu g chia b-a, phương trình đã rút gọn có hệ số khả nghịch, nên có t. Hai nghiệm bất kỳ có hiệu chia hết cho cả n và m, do đó chia hết cho lcm(n,m); vì vậy lớp nghiệm modulo K là duy nhất.
Độ phức tạp: O(log min(n,m)) mỗi test; O(1) bộ nhớ.
Lỗi thường gặp: Chỉ kiểm tra gcd(n,m)=1 rồi kết luận các trường hợp còn lại vô nghiệm.
Lỗi thường gặp: Dùng K=nm thay vì n/gm.
Lỗi thường gặp: Lấy modulo số âm bằng toán tử % của C++ mà không chuẩn hóa.