結果

問題 No.1172 Add Recursive Sequence
ユーザー akakimidori
提出日時 2021-05-06 02:38:34
言語 Rust
(1.83.0 + proconio)
結果
TLE  
実行時間 -
コード長 1,495 bytes
コンパイル時間 13,104 ms
コンパイル使用メモリ 390,704 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-09-13 19:03:35
合計ジャッジ時間 26,937 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 14 TLE * 2
権限があれば一括ダウンロードができます

ソースコード

diff #

fn read() -> (usize, Vec<u64>, Vec<u64>, Vec<(usize, usize)>) {
    let mut s = String::new();
    use std::io::Read;
    std::io::stdin().read_to_string(&mut s).unwrap();
    let mut it = s.trim().split_whitespace();
    let mut next = || it.next().unwrap().parse::<usize>().unwrap();
    let k = next();
    let n = next();
    let m = next();
    let mut a = vec![0; k];
    for a in a.iter_mut() {
        *a = next() as u64;
    }
    let mut c = vec![0; k];
    for c in c.iter_mut() {
        *c = next() as u64;
    }
    let mut p = vec![(0, 0); m];
    for p in p.iter_mut() {
        p.0 = next();
        p.1 = next();
    }
    (n, a, c, p)
}

#[target_feature(enable = "avx2")]
unsafe fn add(a: &mut [u64], b: &[u64]) {
    for (a, b) in a.iter_mut().zip(b) {
        *a += *b;
    }
}

fn run() {
    let (n, a, c, p) = read();
    const MOD: u64 = 1_000_000_007;
    let mut dp = vec![0; n.max(a.len())];
    for (i, a) in a.iter().enumerate() {
        dp[i] = *a;
    }
    for i in a.len()..n {
        let mut s = 0;
        for (dp, c) in dp[..i].iter().rev().zip(&c) {
            s = (s + *c * *dp) % MOD;
        }
        dp[i] = s;
    }
    let mut ans = vec![0; n];
    for (l, r) in p {
        unsafe {
            add(&mut ans[l..r], &dp);
        }
    }
    use std::io::Write;
    let out = std::io::stdout();
    let mut out = std::io::BufWriter::new(out.lock());
    for a in ans {
        writeln!(out, "{}", a % MOD).ok();
    }
}

fn main() {
    run();
}
0