[NOI2016]循环之美
Posted StaroForgin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NOI2016]循环之美相关的知识,希望对你有一定的参考价值。
循环之美
题解
我们记
n
,
m
,
K
n,m,K
n,m,K对应的答案为
f
(
n
,
m
,
K
)
f(n,m,K)
f(n,m,K),显然有,
f
(
n
,
m
,
K
)
=
∑
x
=
1
n
∑
y
=
1
m
[
(
x
,
y
)
=
1
]
[
y
∣
K
k
−
1
]
=
∑
x
=
1
n
∑
y
=
1
m
[
(
x
,
y
)
=
1
]
[
K
k
≡
1
m
o
d
y
]
f(n,m,K)=\\sum_x=1^n\\sum_y=1^m[(x,y)=1][y|K^k-1]\\\\ =\\sum_x=1^n\\sum_y=1^m[(x,y)=1][K^k\\equiv 1\\mod y]
f(n,m,K)=x=1∑ny=1∑m[(x,y)=1][y∣Kk−1]=x=1∑ny=1∑m[(x,y)=1][Kk≡1mody]由欧拉降幂可知,当且仅当
(
K
,
y
)
=
1
(K,y)=1
(K,y)=1时,存在
[
K
k
≡
1
m
o
d
y
]
[K^k\\equiv 1\\mod y]
[Kk≡1mody],所以该条件可以等价于
[
(
K
,
y
)
=
1
]
[(K,y)=1]
[(K,y)=1],有
f
(
n
,
m
,
k
)
=
∑
x
=
1
n
∑
y
=
1
m
[
(
x
,
y
)
=
1
]
[
(
K
,
y
)
=
1
]
=
∑
x
=
1
n
∑
y
=
1
m
[
(
x
,
y
)
=
1
]
∑
d
∣
(
y
,
K
)
μ
(
d
)
=
∑
d
=
1
K
μ
(
d
)
∑
x
=
1
n
∑
y
=
1
⌊
m
d
⌋
[
(
x
,
d
y
)
=
1
]
=
∑
d
∣
K
μ
(
d
)
∑
y
=
1
⌊
m
d
⌋
∑
x
=
1
n
[
(
y
,
x
)
=
1
]
[
(
d
,
x
)
=
1
]
=
∑
d
∣
K
μ
(
d
)
f
(
⌊
m
d
⌋
,
n
,
d
)
f(n,m,k)=\\sum_x=1^n\\sum_y=1^m[(x,y)=1][(K,y)=1]\\\\ =\\sum_x=1^n\\sum_y=1^m[(x,y)=1]\\sum_d|(y,K)\\mu(d)\\\\ =\\sum_d=1^K\\mu(d)\\sum_x=1^n\\sum_y=1^\\lfloor\\fracmd\\rfloor[(x,dy)=1]\\\\ =\\sum_d|K\\mu(d)\\sum_y=1^\\lfloor\\fracmd\\rfloor\\sum_x=1^n[(y,x)=1][(d,x)=1]\\\\ =\\sum_d|K\\mu(d)f(\\lfloor\\fracmd\\rfloor,n,d)
f(n,m,k)=x=1∑ny=1∑m[(x,y)=1][(K,y)=1]=x=1∑ny=1∑m[(x,y)=1]d∣(y,K)∑μ(d)=d=1∑Kμ(d)x=1∑ny=1∑⌊dm⌋[(x,dy)=1]=d∣K∑μ(d)y=1∑⌊dm⌋x=1∑n[(y,x)=1][(d,x)=1]=d∣K∑μ(d)f(⌊dm⌋,n,d)
显然是可以递归求解的,我们需要算一下的就是边界的情况。
首先,
f
(
0
,
m
,
k
)
f(0,m,k)
f(0,m,k)与
f
(
n
,
0
,
k
)
f(n,0,k)
f(n,0,k)都应该是
0
0
0,这是显然的,也就是前两维到边界的情况,避免其
k
k
k一直不变。
我们主要减少的其实还是
k
k
k,也就是说我们大部分边界情况都是
f
(
n
,
m
,
1
)
f(n,m,1)
f(n,m,1)的模样,考虑这怎么计算。
f
(
n
,
m
,
1
)
=
∑
x
=
1
n
∑
y
=
1
m
[
(
x
,
y
)
=
1
]
=
∑
d
=
1
μ
(
d
)
⌊
n
d
⌋
⌊
m
d
⌋
f(n,m,1)=\\sum_x=1^n\\sum_y=1^m[(x,y)=1]\\\\ =\\sum_d=1\\mu(d)\\lfloor\\fracnd\\rfloor\\lfloor\\fracmd\\rfloor
f(n,m,1)=x=1∑ny=1∑m[(x,y)=1]=d=1∑μ(d)⌊dn⌋⌊dm⌋显然可以通过整除分块加杜教筛快速求出,杜教筛是用来算
μ
\\mu
μ的前缀和的。
由于我们这里要对两个数整除分块,杜教筛记忆化的标号可以建议使用
⌊
n
d
⌋
+
⌊
m
d
⌋
\\lfloor\\fracnd\\rfloor+\\lfloor\\fracmd\\rfloor
⌊dn⌋+⌊dm⌋来代替,因为这肯定是一个增函数,且我们整除分块每次正好会让其中一个改变。
我们记
g
(
n
)
=
∑
i
=
1
n
μ
(
i
)
g(n)=\\sum_i=1^n\\mu(i)
g(n)=∑[NOI2016]循环之美