Skip to content

Commit 87cc151

Browse files
committed
Solve 075 and 076 in typical90
1 parent cd70dca commit 87cc151

File tree

5 files changed

+144
-5
lines changed

5 files changed

+144
-5
lines changed

atcoder/rust/typical90/src/bin/050.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,30 @@ use proconio::*;
1212
use proconio::marker::*;
1313
use superslice::*;
1414

15+
const Mod: usize = 1000000007;
16+
1517
fn main() {
1618
input! {
19+
n: usize,
20+
l: usize,
21+
}
22+
23+
let mut fact = vec![1; 1000000];
24+
let mut fact_inv = vec![1; 1000000];
25+
let mut inv = vec![1; 1000000];
26+
for i in 2..100000 {
27+
fact[i] = fact[i - 1] * i % Mod;
28+
inv[i] = Mod - inv[Mod % i] * (Mod / i) % Mod;
29+
fact_inv[i] = fact_inv[i - 1] * inv[i] % Mod;
30+
}
1731

32+
let mut ans = 0;
33+
let max_l_num = n / l;
34+
for i in 0..=max_l_num {
35+
let n = (n - i * l) + i;
36+
ans = (ans + fact[n] * (fact_inv[i] * fact_inv[n - i] % Mod)) % Mod;
1837
}
38+
39+
println!("{}", ans)
1940
}
41+

atcoder/rust/typical90/src/bin/052.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,28 @@ use proconio::*;
1212
use proconio::marker::*;
1313
use superslice::*;
1414

15+
const Mod: usize = 1000000007;
16+
1517
fn main() {
1618
input! {
19+
n: usize,
20+
a: [[usize; 6]; n],
21+
}
22+
23+
//
1724

25+
let dice_sums: Vec<usize> = a.iter().map(|dice| dice.iter().sum()).collect();
26+
if dice_sums.len() == 1 {
27+
return println!("{}", dice_sums[0]);
1828
}
29+
30+
let mut total = 0;
31+
for (i, dice) in a.iter().enumerate() {
32+
let s = dice_sums.iter().enumerate().filter(|(k, dice)| *k != i).map(|(k, dice_sum)| dice_sum).product::<usize>() % Mod;
33+
for j in dice {
34+
total = (total + j * s % Mod) % Mod;
35+
}
36+
}
37+
38+
println!("{}", total);
1939
}

atcoder/rust/typical90/src/bin/064.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
use std::cmp::*;
44
use std::collections::*;
5-
use std::io::Write;
65
use std::ops::Bound::*;
76

87
use itertools::*;
@@ -14,6 +13,29 @@ use superslice::*;
1413

1514
fn main() {
1615
input! {
16+
n: usize, q: usize,
17+
mut a: [i128; n],
18+
lrv: [(usize, usize, i128); q],
19+
}
20+
21+
let mut total = 0;
22+
let mut diffs = vec![];
23+
for i in 1..a.len() {
24+
total += (a[i-1] - a[i]).abs();
25+
diffs[i] = (a[i-1] - a[i]).abs();
26+
}
1727

28+
for (l, r, v) in lrv {
29+
let mut diff: i128 = 0;
30+
if l > 1 {
31+
diff += (diffs[l-2] + v).abs() - diffs[l-2];
32+
diffs[l-2] += v;
33+
}
34+
if r < n {
35+
diff += (diffs[r-1] - v).abs() - diffs[r-1];
36+
diffs[r-1] += v;
37+
}
38+
total += diff;
39+
seg_tree.apply_range(l-1, r-1, v);
1840
}
1941
}

atcoder/rust/typical90/src/bin/075.rs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,71 @@ use std::collections::*;
55
use std::io::Write;
66
use std::ops::Bound::*;
77

8-
use itertools::*;
98
use itertools::__std_iter::once;
9+
use itertools::*;
1010
use itertools_num::ItertoolsNum;
11-
use proconio::*;
1211
use proconio::marker::*;
12+
use proconio::*;
1313
use superslice::*;
1414

1515
fn main() {
1616
input! {
17+
n: usize,
18+
}
19+
let prime_num = prime_factors(n).values().sum::<usize>();
20+
println!("{}", (prime_num as f64).log2().ceil())
21+
}
22+
23+
fn prime_factors(mut n: usize) -> HashMap<usize, usize> {
24+
let mut primes = sieve_of_eratosthenes(f64::sqrt(n as f64) as usize);
25+
let mut hm_primes = HashMap::new();
26+
27+
for prime in primes {
28+
while n % prime == 0 {
29+
n /= prime;
30+
if hm_primes.contains_key(&prime) {
31+
let mut x = hm_primes.get_mut(&prime).unwrap();
32+
*x += 1;
33+
} else {
34+
hm_primes.insert(prime, 1);
35+
}
36+
}
37+
}
38+
39+
if n > 1 {
40+
if hm_primes.contains_key(&n) {
41+
let mut x = hm_primes.get_mut(&n).unwrap();
42+
*x += 1;
43+
} else {
44+
hm_primes.insert(n, 1);
45+
}
46+
}
47+
hm_primes
48+
}
49+
50+
fn sieve_of_eratosthenes(n: usize) -> Vec<usize> {
51+
let mut spf = vec![None; n + 1];
52+
let mut is_prime = vec![true; n + 1];
53+
let mut primes = Vec::new();
54+
55+
is_prime[0] = false;
56+
is_prime[1] = false;
57+
58+
for i in 2..n + 1 {
59+
if is_prime[i] {
60+
primes.push(i);
61+
spf[i] = Some(i);
62+
}
63+
64+
for prime in &primes {
65+
if i * prime >= n + 1 || prime > &spf[i].unwrap() {
66+
break;
67+
}
68+
69+
is_prime[i * prime] = false;
1770

71+
spf[i * prime] = Some(*prime);
72+
}
1873
}
74+
primes
1975
}

atcoder/rust/typical90/src/bin/076.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,34 @@ use std::collections::*;
55
use std::io::Write;
66
use std::ops::Bound::*;
77

8-
use itertools::*;
98
use itertools::__std_iter::once;
9+
use itertools::*;
1010
use itertools_num::ItertoolsNum;
11-
use proconio::*;
1211
use proconio::marker::*;
12+
use proconio::*;
1313
use superslice::*;
1414

1515
fn main() {
1616
input! {
17+
n: usize,
18+
a: [usize; n],
19+
}
1720

21+
let total_size = a.iter().sum::<usize>();
22+
let mut cur_size = 0;
23+
let (mut l, mut r) = (0, 0);
24+
let a2 = a.iter().chain(a.iter()).map(|&i| i).collect::<Vec<usize>>();
25+
for (i, size) in a2.iter().enumerate() {
26+
cur_size += size;
27+
r = i;
28+
while cur_size > total_size / 10 {
29+
cur_size -= a2[l];
30+
l += 1;
31+
}
32+
if l <= r && cur_size == total_size / 10 {
33+
return println!("Yes");
34+
}
1835
}
36+
37+
println!("No")
1938
}

0 commit comments

Comments
 (0)