complete 1644.rs 2887.rs 15552.rs 24767.rs 25710.rs 34031.rs
This commit is contained in:
66
storage/zeta/rs/completed/1644.rs
Normal file
66
storage/zeta/rs/completed/1644.rs
Normal file
@@ -0,0 +1,66 @@
|
||||
use std::io::stdin;
|
||||
|
||||
fn get_primes_upto(n: u32) -> Vec<u32> {
|
||||
let mut primes = vec![2];
|
||||
for i in (3..=n).step_by(2) {
|
||||
let mut flag = true;
|
||||
for &p in primes.iter() {
|
||||
if p > (i as f32).sqrt() as u32 {
|
||||
break;
|
||||
}
|
||||
if i % p == 0 {
|
||||
flag = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if flag {
|
||||
primes.push(i);
|
||||
}
|
||||
}
|
||||
|
||||
primes
|
||||
}
|
||||
|
||||
fn get_ways_sum_primes(n: u32) -> usize {
|
||||
let primes = get_primes_upto(n);
|
||||
|
||||
let cumulative_primes: Vec<u32> = std::iter::once(0)
|
||||
.chain(primes.iter().scan(0, |acc, &p| {
|
||||
*acc += p;
|
||||
Some(*acc)
|
||||
}))
|
||||
.collect();
|
||||
|
||||
let mut lo: usize = 0;
|
||||
let mut hi: usize = 1;
|
||||
|
||||
let mut ways: usize = 0;
|
||||
|
||||
let get_sum = |lo: usize, hi: usize| cumulative_primes[hi] - cumulative_primes[lo];
|
||||
|
||||
while lo <= hi && lo < cumulative_primes.len() && hi < cumulative_primes.len() {
|
||||
let s = get_sum(lo, hi);
|
||||
if n == s {
|
||||
ways += 1;
|
||||
lo += 1;
|
||||
} else if n > s {
|
||||
hi += 1;
|
||||
} else {
|
||||
lo += 1;
|
||||
}
|
||||
}
|
||||
|
||||
ways
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let n = stdin()
|
||||
.lines()
|
||||
.next()
|
||||
.unwrap()
|
||||
.unwrap()
|
||||
.parse::<u32>()
|
||||
.unwrap();
|
||||
|
||||
println!("{}", get_ways_sum_primes(n));
|
||||
}
|
||||
Reference in New Issue
Block a user