| 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 |
