// codesnip-guard: BitDp #[cfg_attr(any(),rustfmt::skip)]pub use self::bitdp::{BitDpExt,Combinations,Subsets};#[cfg_attr(any(),rustfmt::skip)]mod bitdp{use super::{One,Zero};use std::ops::{Add,BitAnd,BitOr,BitXor,Div,Not,Shl,Shr,Sub};pub trait BitDpExt:Sized+Copy+Default+PartialEq+Eq+PartialOrd+Ord+Not+BitAnd+BitOr+BitXor+Shl+Shr+Add+Sub+Div+Zero+One{fn contains(self,x:usize)->bool{self&(Self::one()<Self{self|(Self::one()<Self{self&!(Self::one()<bool{self&elements==elements}fn is_superset(self,elements:Self)->bool{elements.is_subset(self)}fn subsets(self)->Subsets{Subsets{mask:self,cur:Some(self)}}fn combinations(n:usize,k:usize)->Combinations{Combinations{mask:Self::one()<{mask:T,cur:Option}implIterator for Subsetswhere T:BitDpExt{type Item=T;fn next(&mut self)->Option{if let Some(cur)=self.cur{self.cur=if cur.is_zero(){None}else{Some((cur-T::one())&self.mask)};Some(cur)}else{None}}}#[derive(Debug,Clone)]pub struct Combinations{mask:T,cur:Option}implIterator for Combinationswhere T:BitDpExt{type Item=T;fn next(&mut self)->Option{if let Some(cur)=self.cur{if curSelf;#[inline]fn is_zero(&self)->bool where Self:PartialEq{self==&Self::zero()}#[inline]fn set_zero(&mut self){*self=Self::zero();}}pub trait One:Sized{fn one()->Self;#[inline]fn is_one(&self)->bool where Self:PartialEq{self==&Self::one()}#[inline]fn set_one(&mut self){*self=Self::one();}}macro_rules!impl_zero_one{($({$(<$T:ident:$Bound:ident>)?$Trait:ident$method:ident$($t:ty)*,$e:expr})*)=>{$(impl_zero_one!(@impl[$(<$T:$Bound>)?]$Trait$method[$($t)*],$e);)*};(@impl[<$T:ident:$Bound:ident>]$Trait:ident$method:ident[$($t:ty)*],$e:expr)=>{$(impl<$T:$Bound>$Trait for$t{fn$method()->Self{$e}})*};(@impl[]$Trait:ident$method:ident[$($t:ty)*],$e:expr)=>{$(impl$Trait for$t{fn$method()->Self{$e}})*};}impl_zero_one!({Zero zero u8 u16 u32 u64 usize i8 i16 i32 i64 isize u128 i128,0}{Zero zero f32 f64,0.}{One one u8 u16 u32 u64 usize i8 i16 i32 i64 isize u128 i128,1}{One one f32 f64,1.}{Zero zero std::num::Wrapping,Self(T::zero())}{One one std::num::Wrapping,Self(T::one())});}