CF154C Double Profiles

题目描述

你在一家开发大型社交网络的公司获得了一份工作。你的第一个任务是查找最有可能属于同一用户的账号。 该社交网络包含 $n$ 个已注册账号,编号为 $1$ 到 $n$。其中有些账号互为好友(“好友”关系是互相的,即如果 $i$ 是 $j$ 的好友,则 $j$ 也是 $i$ 的好友)。我们称账号 $i$ 和 $j$($i\ne j$)为“doubles”,当且仅当对于任意账号 $k$($k\ne i$,$k\ne j$),以下两个条件之一成立:要么 $k$ 同时是 $i$ 和 $j$ 的好友,要么 $k$ 既不是 $i$ 的好友,也不是 $j$ 的好友。此外,$i$ 和 $j$ 本身可以是好友,也可以不是好友。 你的任务是统计有多少个不同的无序账号对 $(i, j)$,使得账号 $i$ 和 $j$ 是 doubles。注意这些对是无序的,即 $(a, b)$ 和 $(b, a)$ 被认为是同一个对。

输入格式

第一行包含两个用空格分隔的整数 $n$ 和 $m$($1 \leq n \leq 10^{6}$,$0 \leq m \leq 10^{6}$),分别表示账号数量和好友对的数量。 接下来 $m$ 行,每行包含一对好友的描述,格式为“$v\ u$”,表示账号 $v$ 和 $u$ ($1 \leq v, u \leq n, v \ne u$)互为好友。保证每对无序好友对不会出现超过一次,并且没有账号与自己互为好友。

输出格式

输出一行一个整数,表示无序 doubles 账号对的数量。 请不要在 C++ 中使用 %lld 指定符来读取或输出 64 位整数。推荐使用 %I64d 指定符。

说明/提示

在前两个样例中,任意两个账号均为 doubles。 在第三个样例中,doubles 对是 $(1,3)$ 和 $(2,4)$。 由 ChatGPT 5 翻译