Problem
给出 n n n个点 m m m条边的无向图,找出图中所有长度为 3 3 3的环。
Solution
根据原图计算每个点的度数,然按以下规则将图转为有向图:
对于原图中一条边,如果两个端点的度数不相等,则度数大的点指向度数小的点。否则,标号大的点指向标号小的点。
将图转换成有向图后,枚举每个点
a
a
a,枚举
a
a
a指向的每个点
b
b
b,枚举
b
b
b指向的每个点
c
c
c,判断点
a
a
a和
c
c
c之间是否有边,如果有,则构成一个三元环,否则不构成三元环。
正确性证明
首先,若将图中的结点按度数为第一关键字,标号为第二关键字排序,则总是小的结点向大的结点连边,故图为一个有向无环图。
其次,对于原图中的一个三元环,也可以按上述方式排序,设排序后三元环的点按顺序排列依次为
a
,
b
,
c
a,b,c
a,b,c,则在有向无环图中其对应有唯一一条路径
a
⇒
b
⇒
c
a\Rightarrow b\Rightarrow c
a⇒b⇒c,从而每个三元环都会被枚举到且仅被枚举一次。
时间复杂度
对于一个度数大于
m
\sqrt{m}
m的点,它指向的点最多
m
\sqrt{m}
m个,这样的点最多
m
\sqrt{m}
m个,故当第二个点度数大于
m
\sqrt{m}
m时枚,举的三元组数量不多于
m
m
m\sqrt{m}
mm个。
对于度数小于
m
\sqrt{m}
m的点,显然当它们都在
m
\sqrt{m}
m个点的完全图中的时候三元环数量最多,而这样的图中的三元组数量也不多于
m
m
m\sqrt{m}
mm个。
故以上算法的时间复杂度为
O
(
m
m
)
O(m\sqrt{m})
O(mm)。
[SDOI2018]旧试题
求
∑
i
=
1
A
∑
j
=
1
B
∑
k
=
1
C
d
(
i
j
k
)
\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ijk)
∑i=1A∑j=1B∑k=1Cd(ijk),
d
(
i
j
k
)
d(ijk)
d(ijk)为
i
∗
j
∗
k
i*j*k
i∗j∗k的因子数。
令
I
(
x
)
=
[
x
=
1
]
,
(
∗
)
=
⌊
A
d
1
⌋
⌊
B
d
2
⌋
⌊
C
d
3
⌋
,
(
∗
∗
)
=
u
(
x
)
u
(
y
)
u
(
z
)
I(x)=[x=1],(*)=\lfloor\frac{A}{d1}\rfloor\lfloor\frac{B}{d2}\rfloor\lfloor\frac{C}{d3}\rfloor,(**)=u(x)u(y)u(z)
I(x)=[x=1],(∗)=⌊d1A⌋⌊d2B⌋⌊d3C⌋,(∗∗)=u(x)u(y)u(z)
∑
i
=
1
A
∑
j
=
1
B
∑
k
=
1
C
d
(
i
j
k
)
=
∑
i
=
1
A
∑
d
1
∣
i
∑
j
=
1
B
∑
d
2
∣
j
∑
k
=
1
C
∑
d
3
∣
k
I
(
(
d
1
,
d
2
)
)
I
(
(
d
2
,
d
3
)
)
I
(
(
d
1
,
d
3
)
)
=
∑
d
1
=
1
A
∑
d
2
=
1
B
∑
d
3
=
1
C
⌊
A
d
1
⌋
⌊
B
d
2
⌋
⌊
C
d
3
⌋
I
(
(
d
1
,
d
2
)
)
I
(
(
d
2
,
d
3
)
)
I
(
(
d
1
,
d
3
)
)
=
∑
d
1
=
1
A
∑
d
2
=
1
B
∑
d
3
=
1
C
(
∗
)
∑
x
∣
(
d
1
,
d
2
)
u
(
x
)
∑
y
∣
(
d
2
,
d
3
)
u
(
y
)
∑
z
∣
(
d
1
,
d
3
)
u
(
z
)
=
∑
x
=
1
m
i
n
(
A
,
B
)
∑
y
=
1
m
i
n
(
B
,
C
)
∑
z
=
1
m
i
n
(
A
,
C
)
u
(
x
)
u
(
y
)
u
(
z
)
∑
x
∣
d
1
,
z
∣
d
1
⌊
A
d
1
⌋
∑
x
∣
d
2
,
y
∣
d
2
⌊
B
d
2
⌋
∑
y
∣
d
3
,
z
∣
d
3
⌊
C
d
3
⌋
=
∑
x
=
1
m
i
n
(
A
,
B
)
∑
y
=
1
m
i
n
(
B
,
C
)
∑
z
=
1
m
i
n
(
A
,
C
)
u
(
x
)
u
(
y
)
u
(
z
)
∑
l
c
m
(
x
,
z
)
∣
d
1
⌊
A
d
1
⌋
∑
l
c
m
(
x
,
y
)
∣
d
2
⌊
B
d
2
⌋
∑
l
c
m
(
y
,
z
)
∣
d
3
⌊
C
d
3
⌋
=
∑
x
=
1
m
(
A
,
B
)
∑
y
=
1
m
(
B
,
C
)
∑
z
=
1
m
(
A
,
C
)
(
∗
∗
)
f
(
[
x
,
z
]
,
A
)
f
(
[
x
,
y
]
,
B
)
f
(
[
y
,
z
]
,
C
)
\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ijk)=\\\sum_{i=1}^A\sum_{d1|i}\sum_{j=1}^B\sum_{d2|j}\sum_{k=1}^C\sum_{d3|k}I((d1,d2))I((d2,d3))I((d1,d3))=\\\sum_{d1=1}^A\sum_{d2=1}^B\sum_{d3=1}^C\lfloor\frac{A}{d1}\rfloor\lfloor\frac{B}{d2}\rfloor\lfloor\frac{C}{d3}\rfloor I((d1,d2))I((d2,d3))I((d1,d3))\\=\sum_{d1=1}^A\sum_{d2=1}^B\sum_{d3=1}^C(*)\sum_{x|(d1,d2)}u(x)\sum_{y|(d2,d3)}u(y)\sum_{z|(d1,d3)}u(z)\\= \sum_{x=1}^{min(A,B)}\sum_{y=1}^{min(B,C)}\sum_{z=1}^{min(A,C)}u(x)u(y)u(z)\\\sum_{x|d1,z|d1}\lfloor\frac{A}{d1}\rfloor\sum_{x|d2,y|d2}\lfloor\frac{B}{d2}\rfloor\sum_{y|d3,z|d3}\lfloor\frac{C}{d3}\rfloor\\= \sum_{x=1}^{min(A,B)}\sum_{y=1}^{min(B,C)}\sum_{z=1}^{min(A,C)}u(x)u(y)u(z)\\\sum_{lcm(x,z)|d1}\lfloor\frac{A}{d1}\rfloor\sum_{lcm(x,y)|d2}\lfloor\frac{B}{d2}\rfloor\sum_{lcm(y,z)|d3}\lfloor\frac{C}{d3}\rfloor\\= \sum_{x=1}^{m(A,B)}\sum_{y=1}^{m(B,C)}\sum_{z=1}^{m(A,C)}(**)f([x,z],A)f([x,y],B)f([y,z],C)
i=1∑Aj=1∑Bk=1∑Cd(ijk)=i=1∑Ad1∣i∑j=1∑Bd2∣j∑k=1∑Cd3∣k∑I((d1,d2))I((d2,d3))I((d1,d3))=d1=1∑Ad2=1∑Bd3=1∑C⌊d1A⌋⌊d2B⌋⌊d3C⌋I((d1,d2))I((d2,d3))I((d1,d3))=d1=1∑Ad2=1∑Bd3=1∑C(∗)x∣(d1,d2)∑u(x)y∣(d2,d3)∑u(y)z∣(d1,d3)∑u(z)=x=1∑min(A,B)y=1∑min(B,C)z=1∑min(A,C)u(x)u(y)u(z)x∣d1,z∣d1∑⌊d1A⌋x∣d2,y∣d2∑⌊d2B⌋y∣d3,z∣d3∑⌊d3C⌋=x=1∑min(A,B)y=1∑min(B,C)z=1∑min(A,C)u(x)u(y)u(z)lcm(x,z)∣d1∑⌊d1A⌋lcm(x,y)∣d2∑⌊d2B⌋lcm(y,z)∣d3∑⌊d3C⌋=x=1∑m(A,B)y=1∑m(B,C)z=1∑m(A,C)(∗∗)f([x,z],A)f([x,y],B)f([y,z],C)
其中
f
(
n
,
m
)
=
∑
i
=
1
n
∗
i
≤
m
⌊
m
n
∗
i
⌋
f(n,m)=\sum\limits_{i=1}^{n*i\le m}\lfloor\frac{m}{n*i}\rfloor
f(n,m)=i=1∑n∗i≤m⌊n∗im⌋,可以预处理,
[
x
,
y
]
=
l
c
m
(
x
,
y
)
[x,y]=lcm(x,y)
[x,y]=lcm(x,y)。
特别地,当
n
>
m
n>m
n>m时
f
(
n
,
m
)
=
0
f(n,m)=0
f(n,m)=0。
故对于枚举的
x
,
y
,
z
x,y,z
x,y,z,需要满足
[
x
,
z
]
≤
A
,
[
x
,
y
]
≤
B
,
[
y
,
z
]
≤
C
[x,z]\le A,[x,y]\le B,[y,z]\le C
[x,z]≤A,[x,y]≤B,[y,z]≤C且
u
(
x
)
u
(
y
)
u
(
z
)
≠
0
u(x)u(y)u(z)\neq 0
u(x)u(y)u(z)=0才对答案有贡献。
建一张
n
(
n
=
m
a
x
(
A
,
B
,
C
)
)
n(n=max(A,B,C))
n(n=max(A,B,C))个点的图,对于点
a
,
b
a,b
a,b,如果
u
(
a
)
u
(
b
)
≠
0
u(a)u(b)\neq 0
u(a)u(b)=0则在点
a
a
a和点
b
b
b之间连一条边权为
l
c
m
(
a
,
b
)
lcm(a,b)
lcm(a,b)的边,问题转换对于这张图中所有的三元环计算上式。采用上述三元环算法即可。
关于建图:枚举
l
c
m
lcm
lcm,根据莫比乌斯函数的性质,如果
u
(
l
c
m
)
=
0
u(lcm)=0
u(lcm)=0则略过,否则枚举
l
c
m
lcm
lcm的因子连边即可(根据实测,在
A
,
B
,
C
≤
1
e
5
A,B,C\le1e5
A,B,C≤1e5的情况下边数在
7
e
5
7e5
7e5左右)。