結果
問題 | No.1036 Make One With GCD 2 |
ユーザー |
|
提出日時 | 2020-04-25 10:03:07 |
言語 | Rust (1.83.0 + proconio) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,962 bytes |
コンパイル時間 | 13,326 ms |
コンパイル使用メモリ | 379,224 KB |
実行使用メモリ | 93,696 KB |
最終ジャッジ日時 | 2024-09-16 13:39:20 |
合計ジャッジ時間 | 32,323 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 40 TLE * 1 |
ソースコード
use std::io::*; mod sparse_table { pub struct SparseTable<T, F> { table: Vec<Vec<T>>, func: F, } impl<T: Copy + Clone, F: Fn(T, T) -> T> SparseTable<T, F> { pub fn new(a: &Vec<T>, id: T, f: F) -> SparseTable<T, F> { let n = a.len(); let max_log = (32 - (n as u32).leading_zeros()) as usize; let mut table = vec![vec![id; n]; max_log]; table[0] = a.clone(); for j in 1..max_log { for i in 0..n - (1 << j) + 1 { table[j][i] = f(table[j - 1][i], table[j - 1][i + (1 << (j - 1))]); } } SparseTable { table: table, func: f, } } pub fn get(&self, from: usize, to: usize) -> T { assert!(from <= to && to <= self.table[0].len() - 1); let lg = (32 - ((to - from + 1) as u32).leading_zeros() - 1) as usize; (self.func)(self.table[lg][from], self.table[lg][to + 1 - (1 << lg)]) } } } fn gcd(a: u64, b: u64) -> u64 { if b == 0 { return a; } gcd(b, a % b) } fn main() { let mut s: String = String::new(); std::io::stdin().read_to_string(&mut s).ok(); let mut itr = s.trim().split_whitespace(); let n: usize = itr.next().unwrap().parse().unwrap(); let a: Vec<u64> = (0..n) .map(|_| itr.next().unwrap().parse().unwrap()) .collect(); let st = sparse_table::SparseTable::new(&a, 1, gcd); let mut ans = a.iter().filter(|&e| *e == 1).count(); for i in 0..n { if st.get(i, n - 1) != 1 { continue; } let mut ng = i; let mut ok = n; while ok - ng > 1 { let mid = (ok + ng) >> 1; if st.get(i, mid) == 1 { ok = mid } else { ng = mid } } ans += n - ok; } println!("{}", ans); }