結果
問題 | No.1036 Make One With GCD 2 |
ユーザー |
|
提出日時 | 2023-02-22 00:16:54 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 354 ms / 2,000 ms |
コード長 | 1,921 bytes |
コンパイル時間 | 13,101 ms |
コンパイル使用メモリ | 384,036 KB |
実行使用メモリ | 23,424 KB |
最終ジャッジ日時 | 2024-07-22 07:25:05 |
合計ジャッジ時間 | 23,848 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 41 |
コンパイルメッセージ
warning: unused variable: `i` --> src/main.rs:69:9 | 69 | for i in 0..n { | ^ help: if this is intentional, prefix it with an underscore: `_i` | = note: `#[warn(unused_variables)]` on by default warning: method `len` is never used --> src/main.rs:25:8 | 11 | / impl<T, F> SWAG<T, F> where 12 | | T: std::fmt::Debug + Copy, 13 | | F: Fn(T, T) -> T, | |_________________- method in this implementation ... 25 | fn len(&self) -> usize { | ^^^ | = note: `#[warn(dead_code)]` on by default
ソースコード
#[derive(Debug, Clone)]struct SWAG<T, F> {front: Vec<T>,back: Vec<T>,unit: T,operator: F,back_agg: T,}impl<T, F> SWAG<T, F> whereT: std::fmt::Debug + Copy,F: Fn(T, T) -> T,{fn new(unit: T, operator: F) -> Self {Self {front: vec![],back: vec![],unit: unit,operator: operator,back_agg: unit}}fn len(&self) -> usize {self.front.len() + self.back.len()}fn push(&mut self, val: T) {self.back.push(val);self.back_agg = (self.operator)(self.back_agg, val);}fn pop(&mut self) -> Option<T> {if self.front.is_empty() {while let Some(p) = self.back.pop() {let fagg = *self.front.last().unwrap_or(&self.unit);self.front.push((self.operator)(p, fagg));}self.back_agg = self.unit;}self.front.pop()}fn fold(&self) -> T {(self.operator)(*self.front.last().unwrap_or(&self.unit), self.back_agg)}}fn gcd(a: usize, b: usize) -> usize {fn _gcd(x: usize, y: usize) -> usize {if y == 0 { return x; }_gcd(y, x%y)}_gcd(a.max(b), a.min(b))}fn main() {let mut n = String::new();std::io::stdin().read_line(&mut n).ok();let n: usize = n.trim().parse().unwrap();let mut a = String::new();std::io::stdin().read_line(&mut a).ok();let a: Vec<usize> = a.trim().split_whitespace().map(|s| s.parse().unwrap()).collect();let mut swag = SWAG::new(0usize, |x, y| gcd(x, y));let mut result = 0usize;let mut idx = 0usize;for i in 0..n {while idx < n && swag.fold() != 1 {swag.push(a[idx]);idx += 1;}result += n - idx + if swag.fold() == 1 { 1 } else { 0 };swag.pop();}println!("{}", result);}