結果

問題 No.2811 Calculation Within Sequence
ユーザー sakikuroesakikuroe
提出日時 2024-07-19 21:27:21
言語 Rust
(1.83.0 + proconio)
結果
WA  
実行時間 -
コード長 3,308 bytes
コンパイル時間 15,208 ms
コンパイル使用メモリ 378,192 KB
実行使用メモリ 9,344 KB
最終ジャッジ日時 2024-07-19 21:27:55
合計ジャッジ時間 19,475 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 37 WA * 4
権限があれば一括ダウンロードができます

ソースコード

diff #

use anmitsu::number_theory::gcd;
use proconio::{fastout, input};

pub mod anmitsu {
    pub mod number_theory {
        /// Returns:
        ///     gcd(a, b)
        ///
        /// Note:
        ///     gcd(0, 0) = 0
        ///     gcd(a, 0) = a
        ///     gcd(a, b) >= 0
        ///     gcd(a, a) == abs(a)
        ///     gcd(a, b) == gcd(b, a)
        ///
        /// Complexity:
        ///     O(log(min(abs(a), abs(b))))
        ///
        /// Exsamples:
        /// ```
        /// use anmitsu::math::number_theory::gcd;
        /// assert_eq!(gcd(0, 0), 0);
        /// assert_eq!(gcd(0, 1), 1);
        /// assert_eq!(gcd(4, 6), 2);
        /// assert_eq!(gcd(4, -6), 2);
        /// assert_eq!(gcd(-4, 6), 2);
        /// assert_eq!(gcd(-4, -6), 2);
        /// assert_eq!(gcd(2, 2), 2);
        /// assert_eq!(gcd(-2, -2), 2);
        /// ```
        pub fn gcd(mut a: i64, mut b: i64) -> u64 {
            while b != 0 {
                (a, b) = (b, a % b);
            }
            a.unsigned_abs()
        }

        /// Returns:
        ///     (x, y): (i64, i64)
        ///     s.t.
        ///         - gcd(a, b) = a * x + b * y
        ///         - max(abs(x), abs(y)) <= max(abs(a), abs(b))
        ///
        /// Complexity:
        ///     O(log(min(abs(a), abs(b))))
        ///
        /// References:
        ///     - [超わかりやすい拡張ユークリッドの互除法 - 簡潔なQ](https://qnighy.hatenablog.com/entry/20091230/1262173513)
        ///
        /// Exsamples:
        /// ```
        /// use anmitsu::math::number_theory::extended_gcd;
        ///
        /// // gcd(10, 4) = 2 = 10 * 1 + 4 * (-2)
        /// assert_eq!(extended_gcd(10, 4), (1, -2));
        ///
        /// // gcd(0, 4) = 4 = 0 * 0 + 4 * 1
        /// assert_eq!(extended_gcd(0, 4), (0, 1));
        ///
        /// // gcd(0, 0) = 0 = 0 * 0 + 0 * 0
        /// assert_eq!(extended_gcd(0, 0), (0, 0));
        ///
        /// // gcd(-12, 7) = 1 = -12 * (-3) + 7 * (-5)
        /// assert_eq!(extended_gcd(-12, 7), (-3, -5));
        /// ```
        pub fn extended_gcd(a: i64, b: i64) -> (i64, i64) {
            if a == 0 && b == 0 {
                return (0, 0);
            } else if a == 0 {
                return (0, if b >= 0 { 1 } else { -1 });
            } else if b == 0 {
                return (if a >= 0 { 1 } else { -1 }, 0);
            }

            let (mut xs, mut ys, mut s) = (1, 0, a);
            let (mut xt, mut yt, mut t) = (0, 1, b);

            while s % t != 0 {
                let q = s / t;
                let (u, xu, yu) = (s - q * t, xs - q * xt, ys - q * yt);
                (xs, ys, xt, yt) = (xt, yt, xu, yu);
                (s, t) = (t, u);
            }

            if t < 0 {
                (-xt, -yt)
            } else {
                (xt, yt)
            }
        }
    }
}

#[fastout]
fn main() {
    input! {
        a: usize, b: usize,
        t: [usize; a],
        s: [usize; b],
    }

    if a < b && (a..b).any(|i| s[i] != 0) {
        println!("No");
        return;
    }

    let mut g = t[0];
    for i in 1..a {
        g = gcd(g as i64, t[i] as i64) as usize;
    }

    if (0..a).any(|i| t[i].abs_diff(*s.get(i).unwrap_or(&0)) % g != 0) {
        println!("No");
    } else {
        println!("Yes");
    }
}
0