use proconio::{fastout, input}; #[fastout] fn main() { input! { n: usize, diff: [(u16, u16); n], } println!("{}", output(solve(n, diff))); } fn dfs(n: usize, diff: &Vec<(u16, u16)>, prev_diff: u16, flag: u8) -> u16 { if flag as u16 == (1 << n) - 1 { return 1; } let mut ans = 0; for i in 0..n { let (l, r) = diff[i]; if (flag >> i) & 1 == 0 && prev_diff <= r { ans += dfs(n, diff, prev_diff.max(l), flag | (1 << i)); } } ans } fn solve(n: usize, diff: Vec<(u16, u16)>) -> u16 { dfs(n, &diff, 0, 0) } fn output(ans: u16) -> u16 { ans }