結果
問題 |
No.2751 429-like Number
|
ユーザー |
![]() |
提出日時 | 2025-03-04 20:59:54 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 562 ms / 4,000 ms |
コード長 | 12,046 bytes |
コンパイル時間 | 11,784 ms |
コンパイル使用メモリ | 389,328 KB |
実行使用メモリ | 8,608 KB |
最終ジャッジ日時 | 2025-03-04 21:00:27 |
合計ジャッジ時間 | 17,451 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 6 |
other | AC * 22 |
コンパイルメッセージ
warning: struct `UnionFind` is never constructed --> src/main.rs:297:8 | 297 | struct UnionFind { | ^^^^^^^^^ | = note: `#[warn(dead_code)]` on by default warning: associated items `new`, `root`, `merge`, `same`, and `groups` are never used --> src/main.rs:302:8 | 301 | impl UnionFind { | -------------- associated items in this implementation 302 | fn new(n: usize) -> Self { | ^^^ ... 308 | fn root(&mut self, x: usize) -> usize { | ^^^^ ... 317 | fn merge(&mut self, x: usize, y: usize) -> usize { | ^^^^^ ... 331 | fn same(&mut self, x: usize, y: usize) -> bool { | ^^^^ ... 335 | fn groups(&mut self) -> Vec<Vec<usize>> { | ^^^^^^ warning: struct `SegTree` is never constructed --> src/main.rs:343:8 | 343 | struct SegTree<S, Op, E> { | ^^^^^^^ warning: associated items `new`, `from_vec`, `set`, `get`, `prod`, and `all_prod` are never used --> src/main.rs:350:8 | 349 | impl<S: Clone, Op: Fn(S, S) -> S, E: Fn() -> S> SegTree<S, Op, E> { | ----------------------------------------------------------------- associated items in this implementation 350 | fn new(op: Op, e: E, n: usize) -> Self { | ^^^ ... 359 | fn from_vec(op: Op, e: E, v: Vec<S>) -> Self { | ^^^^^^^^ ... 374 | fn set(&mut self, index: usize, x: S) { | ^^^ ... 383 | fn get(&self, index: usize) -> S { | ^^^ ... 387 | fn prod(&self, l: usize, r: usize) -> S { | ^^^^ ... 408 | fn all_prod(&self) -> S { | ^^^^^^^^ warning: function `lcm` is never used --> src/main.rs:31:12 | 31 | pub fn lcm<T>(a: T, b: T) -> T where T: UInteger { | ^^^ warning: function `pow` is never used --> src/main.rs:60:12 | 60 | pub fn pow<T,U>(base: T, exp: U) -> T | ^^^ warning: function `lpf` is never used --> src/main.rs:83:12 | 83 | pub fn lpf(n: usi
ソースコード
fn getline() -> String{ let mut __ret=String::new(); std::io::stdin().read_line(&mut __ret).unwrap(); return __ret; } fn main() { let t=getline(); let q:usize=t.trim().parse().unwrap(); for _ in 0..q{ let t=getline(); let p:usize=t.trim().parse().unwrap(); let prime=mathutils::pollard_rho_factorize(p); println!("{}",if prime.len()==3{"Yes"}else{"No"}); } } mod mathutils{ pub trait Integer : Copy + PartialEq + std::ops::Add<Output = Self> + std::ops::Sub<Output = Self> + std::ops::Rem<Output = Self> + std::ops::Mul<Output = Self> + std::ops::Div<Output = Self> + From<u8> + std::ops::BitAnd<Output = Self> + std::ops::ShrAssign + std::ops::Neg<Output = Self> + std::cmp::PartialOrd{} impl<T> Integer for T where T: Copy + PartialEq + std::ops::Add<Output = Self> + std::ops::Sub<Output = Self> + std::ops::Rem<Output = T> + std::ops::Mul<Output = T> + std::ops::Div<Output = T> + From<u8> + std::ops::BitAnd<Output = T> + std::ops::ShrAssign + std::ops::Neg<Output = T> + std::cmp::PartialOrd {} pub trait UInteger : Copy + PartialEq + std::ops::Add<Output = Self> + std::ops::Sub<Output = Self> + std::ops::Rem<Output = Self> + std::ops::Mul<Output = Self> + std::ops::Div<Output = Self> + From<u8> + std::ops::BitAnd<Output = Self> + std::ops::ShrAssign + std::cmp::PartialOrd + std::ops::Shl<Output = Self>{} impl<T> UInteger for T where T: Copy + PartialEq + std::ops::Add<Output = Self> + std::ops::Sub<Output = Self> + std::ops::Rem<Output = T> + std::ops::Mul<Output = T> + std::ops::Div<Output = T> + From<u8> + std::ops::BitAnd<Output = T> + std::ops::ShrAssign + std::cmp::PartialOrd + std::ops::Shl<Output = Self>{} pub fn gcd<T>(a: T, b: T) -> T where T: UInteger { let (mut a, mut b) = (a, b); while b != T::from(0) { (a, b) = (b, a % b); } a } pub fn lcm<T>(a: T, b: T) -> T where T: UInteger { a / gcd(a, b) * b } pub fn extgcd<T>(a: T, b: T) -> (T, T, T) where T: UInteger { if b == T::from(0) { return (a, T::from(1), T::from(0)); } let (d, x, y) = extgcd(b, a % b); (d, y, x - a / b * y) } pub fn powmod<T,U>(base: T, exp: U, modulo: T) -> T where T: UInteger, U: Integer, { if exp < U::from(0) { return powmod(invmod(base, modulo), -exp, modulo); } let (mut base, mut exp, mut res) = (base, exp, T::from(1)); while exp!=U::from(0) { if exp&U::from(1) == U::from(1) { res = (res * base) % modulo; } exp >>= U::from(1); base = (base * base) % modulo; } res } pub fn pow<T,U>(base: T, exp: U) -> T where T: UInteger, U: Integer { let (mut base, mut exp, mut res) = (base, exp, T::from(1)); while exp != U::from(0) { if exp&U::from(1) == U::from(1) { res = res * base; } exp >>= U::from(1); if exp == U::from(0){ break; } base = base * base; } res } pub fn invmod<T>(x: T, modulo: T) -> T where T: UInteger { let (d, x, _) = extgcd(x, modulo); assert!(d==T::from(1)); (x + modulo) % modulo } pub fn lpf(n: usize) -> Vec<usize> { let mut prime = vec![]; let mut lpf = vec![1; n + 1]; for d in 2..=n { if lpf[d] == 1 { lpf[d] = d; prime.push(d); } for &p in &prime { if p*d > n || p > lpf[d] { break; } lpf[p*d] = p; } } lpf } pub fn lpf_factorize(n: usize, lpf: &Vec<usize>) -> Vec<(usize, usize)> { let mut prime = vec![]; let mut n = n; while n > 1{ let mut exp = 0; let p = lpf[n]; while n % p == 0 { n /= p; exp += 1; } prime.push((p, exp)); } prime } pub fn lpf_divisors(n: usize, lpf: &Vec<usize>) -> Vec<usize> { let prime = self::lpf_factorize(n, &lpf); let mut divisors = vec![1]; for i in 0..prime.len() { let mut new_divisors = vec![]; for &d in &divisors { let mut mul = 1; for _ in 0..=prime[i].1 { new_divisors.push(d * mul); mul *= prime[i].0; } } divisors = new_divisors; } divisors } pub fn factorize(n: usize) -> Vec<(usize, usize)> { let mut prime = vec![]; let (mut n, mut d) = (n, 2); while d*d <= n { let mut exp = 0; while n % d == 0 { n /= d; exp += 1; } if exp > 1 { prime.push((d, exp)); } d += 1; } if n > 1 { prime.push((n, 1)); } prime } pub fn divisors(n: usize) -> Vec<usize> { let mut divisors = vec![]; let mut d = 1; while d*d <= n { if n % d == 0 { divisors.push(d); if d*d != n { divisors.push(n / d); } } d += 1; } divisors } pub fn is_prime(n: usize) -> bool { if n < 2 { return false; } let mut d = 2; while d*d <= n { if n % d == 0 { return false; } d += 1; } true } pub struct Xorshift64 { a: u64, } pub fn xorshift64(state: &mut Xorshift64) -> u64 { let mut x: u64 = state.a; x ^= x << 13; x ^= x >> 7; x ^= x << 17; state.a = x; x } pub fn miller_rabin(n: usize) -> bool { let n = n as u128; let test_number: [u128; 7] = [2, 325, 9375, 28178, 450775, 9780504, 1795265022]; if n == 2 { return true; } if n == 1 || n & 1 == 0 { return false; } let mut d = n - 1; while d & 1 == 0 { d >>= 1; } for &a in &test_number { let a = (a % (n - 1)) + 1; let mut t = d; let mut y = powmod(a, t as i128, n); while t != n - 1 && y != 1 && y != n - 1 { y = (y * y) % n; t <<= 1; } if y != n - 1 && t & 1 == 0 { return false; } } true } pub fn pollard_rho(n: usize) -> usize { let n = n as u128; if n & 1 == 0 { return 2_usize; } if miller_rabin(n as usize) { return n as usize; } let mut state = self::Xorshift64 { a: n as u64 }; let mut step: u128 = 0; loop { step=(step + self::xorshift64(&mut state) as u128 % n ) % n; let (mut x, mut y) = (step, (self::powmod(step, 2, n) + step) % n); loop { let p = self::gcd(if y >= x {y - x} else {x - y} + n, n); if p == 0 || p == n { break; } if p != 1 { return p as usize; } x = (self::powmod(x, 2, n) + step) % n; y = (self::powmod(self::powmod(y, 2, n) + step, 2, n) + step) % n; } } } pub fn pollard_rho_factorize(n: usize) -> Vec<usize> { if n == 1 { return vec![]; } if miller_rabin(n) { return vec![n]; } let d = pollard_rho(n); let mut res = pollard_rho_factorize(d); res.append(&mut pollard_rho_factorize(n / d)); res } pub struct Combination { fact: Vec<usize>, inv_fact: Vec<usize>, modulo: Option<usize>, } impl Combination { pub fn new(n: usize, modulo: Option<usize>) -> Self { let mut fact = vec![1; n + 1]; let mut inv_fact = vec![1; n + 1]; if let Some(m) = modulo { for i in 1..=n { fact[i] = fact[i - 1] * i % m; } inv_fact[n] = self::powmod(fact[n] as i64, -1_i64, m as i64) as usize; for i in (1..=n).rev() { inv_fact[i - 1] = inv_fact[i] * i % m; } } else { for i in 1..=n { fact[i] = fact[i - 1] * i; } } Self { fact, inv_fact, modulo } } pub fn comb(&self, n: usize, k: usize) -> usize { if n < k { return 0; } if let Some(m) = self.modulo { self.fact[n] * self.inv_fact[k] % m * self.inv_fact[n - k] % m } else { self.fact[n] / self.fact[k] / self.fact[n - k] } } } } struct UnionFind { parent: Vec<usize>, rank: Vec<usize>, } impl UnionFind { fn new(n: usize) -> Self { let parent = (0..n).collect(); let rank = vec![1; n]; Self { parent, rank } } fn root(&mut self, x: usize) -> usize { if self.parent[x] == x { x } else { self.parent[x] = self.root(self.parent[x]); self.parent[x] } } fn merge(&mut self, x: usize, y: usize) -> usize { let mut x = self.root(x); let mut y = self.root(y); if x == y { return x; } if self.rank[x] < self.rank[y] { (x, y) = (y, x); } self.rank[x] += self.rank[y]; self.parent[y] = x; x } fn same(&mut self, x: usize, y: usize) -> bool { self.root(x) == self.root(y) } fn groups(&mut self) -> Vec<Vec<usize>> { let mut group = vec![vec![]; self.parent.len()]; for i in 0..self.parent.len() { group[self.root(i)].push(i); } group.into_iter().filter(|x| !x.is_empty()).collect() } } struct SegTree<S, Op, E> { size: usize, d: Vec<S>, op: Op, e: E, } impl<S: Clone, Op: Fn(S, S) -> S, E: Fn() -> S> SegTree<S, Op, E> { fn new(op: Op, e: E, n: usize) -> Self { let mut size = 1; while size < n { size <<= 1; } let d = vec![e(); size << 1]; Self { size, d, op, e } } fn from_vec(op: Op, e: E, v: Vec<S>) -> Self { let mut size = 1; while size < v.len() { size <<= 1; } let mut d = vec![e(); size << 1]; for i in 0..v.len() { d[size + i] = v[i].clone(); } for i in (1..size).rev() { d[i] = (op)(d[i << 1].clone(), d[(i << 1) | 1].clone()); } Self { size, d, op, e } } fn set(&mut self, index: usize, x: S) { let mut i = index + self.size; self.d[i] = x; while i > 1 { i >>= 1; self.d[i] = (self.op)(self.d[i << 1].clone(), self.d[(i << 1) | 1].clone()); } } fn get(&self, index: usize) -> S { self.d[index + self.size].clone() } fn prod(&self, l: usize, r: usize) -> S { let mut sml = (self.e)(); let mut smr = (self.e)(); let mut l = l + self.size; let mut r = r + self.size; while l < r { if l & 1 == 1 { sml = (self.op)(sml, self.d[l].clone()); l += 1; } if r & 1 == 1 { r -= 1; smr = (self.op)(self.d[r].clone(), smr); } l >>= 1; r >>= 1; } (self.op)(sml, smr) } fn all_prod(&self) -> S { self.d[1].clone() } }