Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #[macro_use] extern crate scan_rules;
- fn main() {
- loop {
- let_readln!(let num: i64);
- if num == 0 { break; }
- let_readln!(let c1: i64, let a: i64);
- let_readln!(let c2: i64, let b: i64);
- let (a, b, reverse) = if a < b {(a, b, false)} else {(b, a, true)};
- let ratio_a = a as f64 / c1 as f64;
- let ratio_b = b as f64 / c2 as f64;
- if let Some((x, y, gcd)) = eu(a, b, num) {
- let (a, b, x, y, reverse) = {
- if ratio_a > ratio_b {
- (a/gcd, b/gcd, x, y, reverse)
- } else {
- (b/gcd, a/gcd, y, x, !reverse)
- }
- };
- let steps = -y/a + if y < 0 {1} else {0}; // y -> 0
- let (x, y) = (gcd*(x - steps * b), gcd*(y + steps * a));
- let (x, y) = if !reverse {(x, y)} else {(y,x)};
- println!("{} {}", x, y);
- } else {
- println!("failure");
- }
- }
- }
- fn eu(a: i64, b: i64, c: i64) -> Option<(i64, i64, i64)> {
- if b % a == 0 {
- if c % a == 0 {
- Some(((c % b) / a, c / b, a))
- } else { None }
- } else {
- let (r1, r2, gcd) = eu(b % a, a, c)?;
- Some((r2 - (b / a)*r1, r1, gcd))
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement