cp_library_rs/in_ex.rs
1//! 包除原理
2
3/// 高次元配列に対して包除原理を適用する
4///
5/// ---
6///
7/// 2次元累積和の実装例
8///
9/// ```rust
10/// use cp_library_rs::in_ex;
11///
12/// // 3次元累積和
13/// let a = [[1, 2], [3, 4]];
14/// let mut s = [[0; 3]; 3];
15///
16/// for i in 0..2 {
17/// for j in 0..2 {
18/// s[i+1][j+1] = a[i][j] - in_ex!(s; i+1,i; j+1,j);
19/// }
20/// }
21///
22/// assert_eq!(s, [[0, 0, 0], [0, 1, 3], [0, 4, 10]]);
23/// ```
24#[macro_export]
25macro_rules! in_ex {
26 ($arr:expr ; $include:expr , $exclude:expr) => {
27 ($arr[$include]) - ($arr[$exclude])
28 };
29 ($arr:expr ; $in0:expr , $ex0:expr $(; $in_i:expr , $ex_i:expr)+) => {
30 in_ex!($arr[$in0] $(; $in_i, $ex_i)*)
31 - in_ex!($arr[$ex0] $(; $in_i, $ex_i)*)
32 };
33}