class Union_Find(): __slots__=["n","parents","rank","edges","__group_number"] def __init__(self,N): """ 0,1,...,N-1 を要素として初期化する. N: 要素数 """ self.n=N self.parents=[-1]*N self.rank=[0]*N self.edges=[0]*N self.__group_number=N def find(self, x): """ 要素 x の属している族を調べる. x: 要素 """ V=[] while self.parents[x]>=0: V.append(x) x=self.parents[x] for v in V: self.parents[v]=x return x def union(self, x, y): """ 要素 x,y を同一視する. [input] x,y: 要素 [output] 元々が非連結 → True 元々が連結 → False """ x=self.find(x) y=self.find(y) if x==y: self.edges[x]+=1 return False if self.rank[x]>=1 Ans=0 base=1 for k in range(W): for g in U[k].representative(): alpha=U[k].size(g) beta=alpha*(alpha-1)//2%Mod Ans+=base*beta Ans%=Mod base<<=1 print(Ans)