use itertools::iproduct;
use proconio::input;
use std::collections::HashMap;
fn vec2hashmap_mod46_counter(x: Vec<usize>) -> HashMap<usize, usize> {
x.into_iter()
.map(|x| x % 46)
.fold(HashMap::new(), |mut hashmap, item| {
let counter = hashmap.entry(item).or_insert(0);
*counter += 1;
hashmap
})
}
fn main() {
input! {
n: usize,
a: [usize; n],
b: [usize; n],
c: [usize; n],
}
let a = vec2hashmap_mod46_counter(a);
let b = vec2hashmap_mod46_counter(b);
let c = vec2hashmap_mod46_counter(c);
let mut ans = 0;
for (x, y, z) in iproduct!(a.keys(), b.keys(), c.keys()) {
if (x + y + z) % 46 == 0 {
ans += a[x] * b[y] * c[z];
}
}
println!("{}", ans);
}
HashMap
にする関数を vec2hashmap_mod46_counter()
としました。この関数を動作確認用に少し改変したものが下のコードです。use std::collections::HashMap;
fn vec2hashmap_mod5_counter(x: Vec<usize>) -> HashMap<usize, usize> {
x.into_iter()
.map(|x| x % 5)
.fold(HashMap::new(), |mut hashmap, item| {
let counter = hashmap.entry(item).or_insert(0);
*counter += 1;
hashmap
})
}
let a = (1..9).collect();
println!("a: {:?}", &a);
let counter = vec2hashmap_mod5_counter(a);
println!("{:#?}", counter);
HashMap<余り, 個数>
とすれば、あとはlet mut ans = 0;
for (x, y, z) in iproduct!(a.keys(), b.keys(), c.keys()) {
if (x + y + z) % 46 == 0 {
ans += a[x] * b[y] * c[z];
}
}
itertools::iproduct!
が便利