https://atcoder.jp/contests/math-and-algorithm/tasks/typical90_d
包除原理ですね。i行目の和を、j行目の和をとすると、が求める和です。
// Cross Sum #![allow(non_snake_case)] //////////////////// library //////////////////// fn read<T: std::str::FromStr>() -> T { let mut line = String::new(); std::io::stdin().read_line(&mut line).ok(); line.trim().parse().ok().unwrap() } fn read_vec<T: std::str::FromStr>() -> Vec<T> { read::<String>().split_whitespace() .map(|e| e.parse().ok().unwrap()).collect() } //////////////////// process //////////////////// type Matrix = Vec<Vec<i32>>; fn read_input() -> Matrix { let v = read_vec(); let H = v[0]; let A: Matrix = (0..H).map(|_| read_vec()).collect(); A } fn f(A: Matrix) { let H = A.len(); let W = A[0].len(); let row_sums: Vec<i32> = A.iter().map(|v| v.iter().sum::<i32>()).collect(); let col_sums: Vec<i32> = (0..W).map(|j| (0..H).map(|i| A[i][j]). sum::<i32>()).collect(); for i in 0..H { let v: Vec<i32> = (0..W).map(|j| row_sums[i] + col_sums[j] - A[i][j]). collect(); let ss: Vec<String> = v.iter().map(|s| s.to_string()).collect(); println!("{}", ss.join(" ")) } } fn main() { let A = read_input(); f(A) }