Task: | Neliöt |
Sender: | Hennkka |
Submission time: | 2020-11-06 21:16:13 +0200 |
Language: | Rust |
Status: | READY |
Result: | 100 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 28 |
#2 | ACCEPTED | 72 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.01 s | 1, 2 | details |
#2 | ACCEPTED | 0.01 s | 1, 2 | details |
#3 | ACCEPTED | 0.01 s | 2 | details |
Compiler report
warning: unused variable: `j` --> input/code.rs:21:9 | 21 | for j in (0..).map(|j| 1 << j).take_while(|j| *j < even) { | ^ help: consider prefixing with an underscore: `_j` | = note: `#[warn(unused_variables)]` on by default warning: unused variable: `i` --> input/code.rs:82:21 | 82 | for i in (0..).take_while(|i| *i * *i <= n) { | ^ help: consider prefixing with an underscore: `_i`
Code
use rand::prelude::*; use std::collections::BTreeMap; use std::io::BufRead; fn powmod(b: u64, e: u64, m: u64) -> u64 { if e == 0 { 1 } else if e % 2 == 0 { let p = powmod(b, e / 2, m) as u128; ((p * p) % m as u128) as u64 } else { ((b as u128 * powmod(b, e - 1, m) as u128) % m as u128) as u64 } } fn is_w(a: u64, even: u64, odd: u64, p: u64) -> bool { let mut u = powmod(a, odd, p); if u == 1 { return false; } for j in (0..).map(|j| 1 << j).take_while(|j| *j < even) { if u == p - 1 { return false; } u = ((u as u128 * u as u128) % p as u128) as u64; } true } fn is_prime(p: u64) -> bool { if p == 2 { true } else if p <= 1 || p % 2 == 0 { false } else { let mut odd = p - 1; let mut even = 1; while odd % 2 == 0 { even *= 2; odd /= 2; } for b in &[2, 325, 9375, 28178, 450775, 9780504, 1795265022] { let a = b % p; if a == 0 { return true; } if is_w(a, even, odd, p) { return false; } } true } } pub fn gcd(a: u64, b: u64) -> u64 { if b == 0 { a } else { gcd(b, a % b) } } fn factor(n: u64) -> BTreeMap<u64, usize> { fn step(x: &mut u64, n: u64, c: u64) { *x = ((*x as u128 * *x as u128 + c as u128) % n as u128) as u64; } fn f(n: u64, r: &mut BTreeMap<u64, usize>) { let mut n = n; while n % 2 == 0 { n /= 2; *r.entry(2).or_insert(0) += 1; } if n == 1 { } else if is_prime(n) { *r.entry(n).or_insert(0) += 1; } else { loop { let mut x = thread_rng().next_u64() % n; let mut y = x; let c = thread_rng().next_u64() % n; for i in (0..).take_while(|i| *i * *i <= n) { step(&mut x, n, c); step(&mut x, n, c); step(&mut y, n, c); let g = gcd(x.max(y) - x.min(y), n); if g == n { break; } else if g > 1 { f(n / g, r); f(g, r); return; } } } } } let mut res = BTreeMap::new(); if n > 1 { f(n, &mut res); } res } fn solve(c: usize) -> bool { for (p, k) in factor(c as u64) { if p % 4 == 3 && k % 2 == 1 { return false; } } true } fn main() { let stdin = std::io::stdin(); let stdin = stdin.lock(); let mut lines = stdin.lines(); let t: usize = lines.next().unwrap().unwrap().parse().unwrap(); for _ in 0..t { let c: usize = lines.next().unwrap().unwrap().parse().unwrap(); if solve(c) { println!("YES"); } else { println!("NO"); } } } #[cfg(test)] mod tests { use super::*; #[test] fn test_prime() { assert!(is_prime(2)); assert!(is_prime(3)); assert!(is_prime(5)); assert!(is_prime(7)); assert!(is_prime(11)); assert!(is_prime(13)); assert!(is_prime(1_000_000_007)); assert!(is_prime(1_000_000_009)); assert!(!is_prime(14)); assert!(!is_prime(15)); assert!(!is_prime(1_000_000_007 * 1_000_000_009)); } #[test] fn test_factor() { assert_eq!(factor(16), [(2, 4)].into_iter().copied().collect()); assert_eq!(factor(15), [(3, 1), (5, 1)].into_iter().copied().collect()); assert_eq!( factor(1_000_000_007 * 1_000_000_009), [(1_000_000_007, 1), (1_000_000_009, 1)] .into_iter() .copied() .collect() ); } }
Test details
Test 1
Group: 1, 2
Verdict: ACCEPTED
input |
---|
100 1 2 3 4 ... |
correct output |
---|
YES YES NO YES YES ... |
user output |
---|
YES YES NO YES YES ... Truncated |
Test 2
Group: 1, 2
Verdict: ACCEPTED
input |
---|
100 522 419 402 969 ... |
correct output |
---|
YES NO NO NO NO ... |
user output |
---|
YES NO NO NO NO ... Truncated |
Test 3
Group: 2
Verdict: ACCEPTED
input |
---|
100 575833539 744851460 436154655 655319365 ... |
correct output |
---|
NO NO NO NO NO ... |
user output |
---|
NO NO NO NO NO ... Truncated |