20210903下午
难度上来了,好耶
T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | |
---|---|---|---|---|---|---|---|---|
预测 | 100 | 100 | 100 | 100 | 100 | 100 | 0 | 100 |
一测 | 100 | 100 | 0 | 100 | 0 | 100 | 0 | 100 |
T1:
先找因数和,再找因数和的因数和,判断是否相等与越界。
T2:
模拟,注意别在这轮把下轮出局的数删了。
T3:
和前几天一样构造二叉树,边造边统计即可,数组开小了寄了,但数据范围在哪呢?怎么回事呢?
T4:
如题目下提示所示,bfs即可。
T5:
矩阵转移即可,设
f
i
f_i
fi为数列第
i
i
i项,
S
i
S_i
Si为前
i
i
i项和。
[
S
i
f
i
f
i
−
1
]
=
[
S
i
−
1
+
f
i
f
i
f
i
−
1
]
=
[
1
×
S
i
−
1
+
1
×
f
i
−
1
+
1
×
f
i
−
2
0
×
S
i
−
1
+
1
×
f
i
−
1
+
1
×
f
i
−
2
0
×
S
i
−
1
+
1
×
f
i
−
1
+
0
×
f
i
−
2
]
=
[
S
i
−
1
f
i
−
1
f
i
−
2
]
×
[
1
1
1
0
1
1
0
1
1
]
=
⋯
=
[
S
1
f
1
f
0
]
×
[
1
1
1
0
1
1
0
1
1
]
n
−
1
=
[
1
1
0
]
×
[
1
1
1
0
1
1
0
1
1
]
n
−
1
\begin{bmatrix} S_i \\ f_i \\ f_{i-1} \end{bmatrix}=\begin{bmatrix} S_{i-1}+f_i \\ f_i\\ f_{i-1} \end{bmatrix}=\begin{bmatrix} 1\times S_{i-1}+1\times f_{i-1}+1\times f_{i-2}\\ 0\times S_{i-1}+1\times f_{i-1}+1\times f_{i-2}\\ 0\times S_{i-1}+1\times f_{i-1}+0\times f_{i-2} \end{bmatrix}=\begin{bmatrix} S_{i-1}\\ f_{i-1}\\ f_{i-2}\\ \end{bmatrix} \times \begin{bmatrix} 1&1&1\\ 0&1&1\\ 0&1&1 \end{bmatrix}=\cdots=\begin{bmatrix} S_1\\ f_1\\ f_0 \end{bmatrix} \times \begin{bmatrix} 1&1&1\\ 0&1&1\\ 0&1&1 \end{bmatrix}^{n-1}=\\ \begin{bmatrix} 1\\ 1\\ 0 \end{bmatrix}\times \begin{bmatrix} 1&1&1\\ 0&1&1\\ 0&1&1 \end{bmatrix}^{n-1}
⎣⎡Sififi−1⎦⎤=⎣⎡Si−1+fififi−1⎦⎤=⎣⎡1×Si−1+1×fi−1+1×fi−20×Si−1+1×fi−1+1×fi−20×Si−1+1×fi−1+0×fi−2⎦⎤=⎣⎡Si−1fi−1fi−2⎦⎤×⎣⎡100111111⎦⎤=⋯=⎣⎡S1f1f0⎦⎤×⎣⎡100111111⎦⎤n−1=⎣⎡110⎦⎤×⎣⎡100111111⎦⎤n−1
矩阵快速幂即可。考试自信不开long long,他真的。。。怎么这么猪比啊,我真的哭死。
T6:
很有难度的几何。
首先确定思路用总的方案数减共线的方案数。可以考虑出总的减横着竖着的情况为
C
n
m
3
−
C
n
3
×
m
−
C
m
3
×
n
C_{nm}^3-C_n^3 \times m-C_m^3 \times n
Cnm3−Cn3×m−Cm3×n,接下来就是考虑斜线的情况。
考虑枚举
(
1
,
1
)
(1,1)
(1,1)与
(
n
+
1
,
m
+
1
)
(n+1,m+1)
(n+1,m+1)之间的每一个点,它与原点
(
0
,
0
)
(0,0)
(0,0)便确定了两个点,那在这条线段上的每一点都与这两个点构成三点共线(确定在线段上就可以确定不重不漏),那么这条线段上除两端点有多少个端点呢,答案是
(
i
,
j
)
(i,j)
(i,j)到
(
0
,
0
)
(0,0)
(0,0)之间有
g
c
d
(
i
,
j
)
−
1
gcd(i,j)-1
gcd(i,j)−1个点,也很好证明。易得这条线段从下往上除
(
0
,
0
)
(0,0)
(0,0)外第一个点为
(
i
/
g
c
d
(
i
,
j
)
,
j
/
g
c
d
(
i
,
j
)
)
(i/gcd(i,j),j/gcd(i,j))
(i/gcd(i,j),j/gcd(i,j))(即坐标互质的那个点),且从0开始横向每
i
/
g
c
d
(
i
,
j
)
i/gcd(i,j)
i/gcd(i,j)就有一个点,所以点数即为
i
i
/
g
c
d
(
i
,
j
)
=
g
c
d
(
i
,
j
)
\frac{i}{i/gcd(i,j)}=gcd(i,j)
i/gcd(i,j)i=gcd(i,j),去掉
(
i
,
j
)
(i,j)
(i,j)就是
g
c
d
(
i
,
j
)
−
1
gcd(i,j)-1
gcd(i,j)−1个点。(上图可验证,
g
c
d
(
2
,
4
)
=
2
gcd(2,4)=2
gcd(2,4)=2,
(
0
,
0
)
−
(
2
,
4
)
(0,0)-(2,4)
(0,0)−(2,4)上也正好有
2
−
1
=
1
2-1=1
2−1=1个点)所以每条线段的贡献即为
g
c
d
(
i
,
j
)
−
1
gcd(i,j)-1
gcd(i,j)−1。
然后发现线段可以在图内平移,因为横纵坐标为
(
n
+
1
,
m
+
1
)
(n+1,m+1)
(n+1,m+1),所以可以纵向平移
n
+
1
−
i
n+1-i
n+1−i位,横向平移
m
+
1
−
j
m+1-j
m+1−j位,总共
(
n
+
1
−
i
)
(
m
+
1
−
j
)
(n+1-i)(m+1-j)
(n+1−i)(m+1−j)条线段,总贡献就是
(
n
+
1
−
i
)
(
m
+
1
−
j
)
(
g
c
d
(
i
,
j
)
−
1
)
(n+1-i)(m+1-j)(gcd(i,j)-1)
(n+1−i)(m+1−j)(gcd(i,j)−1),注意这样是考虑左下角的情况,右下角的情况是相同的,所以总的情况数为
∑
i
=
1
n
∑
j
=
1
m
(
n
+
1
−
i
)
(
m
+
1
−
j
)
(
g
c
d
(
i
,
j
)
−
1
)
\sum_{i=1}^{n}\sum_{j=1}^{m}(n+1-i)(m+1-j)(gcd(i,j)-1)
∑i=1n∑j=1m(n+1−i)(m+1−j)(gcd(i,j)−1)。
总复杂度为
O
(
n
2
)
O(n^2)
O(n2)
优化
前置知识:
[
⋯
]
[\cdots]
[⋯]表示当
[
]
[]
[]内语句判定为真时为1,否则为0。
欧拉函数
ϕ
(
n
)
\phi(n)
ϕ(n):1-n中与n互质的函数,即
ϕ
(
n
)
=
∑
i
=
1
n
[
g
c
d
(
i
,
n
)
=
=
1
]
\phi(n)=\sum_{i=1}^n[gcd(i,n)==1]
ϕ(n)=∑i=1n[gcd(i,n)==1]
ϕ
(
n
)
\phi(n)
ϕ(n)可用欧拉筛在
O
(
n
)
O(n)
O(n)时间内求出
1
−
n
1-n
1−n的函数值,这个可以去自行了解,在此不多加证明。
ϕ
(
n
)
\phi(n)
ϕ(n)具有性质
n
=
∑
d
∣
n
ϕ
(
d
)
n=\sum_{d|n}\phi(d)
n=∑d∣nϕ(d),可用莫比乌斯反演证明,而另一种证明如下:
定义
f
(
x
)
f(x)
f(x)代表
1
−
n
1-n
1−n中与
n
n
n最大公约数为x的数的个数。即
f
(
x
)
=
∑
i
=
1
n
[
g
c
d
(
n
,
i
)
=
=
x
]
f(x)=\sum_{i=1}^n[gcd(n,i)==x]
f(x)=∑i=1n[gcd(n,i)==x],则显然有
n
=
∑
d
∣
n
f
(
d
)
n=\sum_{d|n}f(d)
n=∑d∣nf(d),即枚举n的每个约数,
1
−
n
1-n
1−n中每个数与n的最大公约数一定是n的一个约数。
因为若
g
c
d
(
i
,
j
)
=
x
gcd(i,j)=x
gcd(i,j)=x,则
g
c
d
(
i
x
,
j
x
)
=
1
gcd(\frac{i}{x},\frac{j}{x})=1
gcd(xi,xj)=1,所以
f
(
x
)
=
∑
i
=
1
n
[
g
c
d
(
n
,
i
)
=
=
x
]
=
∑
i
=
1
n
x
[
g
c
d
(
n
x
,
i
)
=
=
1
]
=
ϕ
(
n
x
)
f(x)=\sum_{i=1}^n[gcd(n,i)==x]=\sum_{i=1}^{\frac{n}{x}}[gcd(\frac{n}{x},i)==1]=\phi(\frac{n}{x})
f(x)=∑i=1n[gcd(n,i)==x]=∑i=1xn[gcd(xn,i)==1]=ϕ(xn)
所以得
n
=
∑
d
∣
n
f
(
d
)
=
∑
d
∣
n
ϕ
(
n
d
)
n=\sum_{d|n}f(d)=\sum_{d|n}\phi(\frac{n}{d})
n=∑d∣nf(d)=∑d∣nϕ(dn),当枚举每个
d
∣
n
d|n
d∣n时
n
d
\frac{n}{d}
dn等价于
d
d
d,所以
n
=
∑
d
∣
n
ϕ
(
d
)
n=\sum_{d|n}\phi(d)
n=∑d∣nϕ(d)得证。
好吧,其实你看不懂上面的证明也是没关系的,你只需要记住结论
n
=
∑
d
∣
n
ϕ
(
d
)
n=\sum_{d|n}\phi(d)
n=∑d∣nϕ(d)就行。
大家可能都知道当看到
[
g
c
d
(
i
,
j
)
=
=
1
]
[gcd(i,j)==1]
[gcd(i,j)==1]的时候我们会用莫比乌斯函数
μ
(
n
)
\mu(n)
μ(n)来反演,事实上当遇到求
g
c
d
(
i
,
j
)
gcd(i,j)
gcd(i,j)时也有一种常见转换思路即利用上述公式将
n
n
n代换为
g
c
d
(
i
,
j
)
gcd(i,j)
gcd(i,j),即
g
c
d
(
i
,
j
)
=
∑
d
∣
g
c
d
(
i
,
j
)
ϕ
(
d
)
gcd(i,j)=\sum_{d|gcd(i,j)}\phi(d)
gcd(i,j)=∑d∣gcd(i,j)ϕ(d)。
我们再来看看原式变为
∑
i
=
1
n
∑
j
=
1
m
(
n
+
1
−
i
)
(
m
+
1
−
j
)
(
∑
d
∣
g
c
d
(
i
,
j
)
ϕ
(
d
)
−
1
)
\sum_{i=1}^{n}\sum_{j=1}^{m}(n+1-i)(m+1-j)(\sum_{d|gcd(i,j)}\phi(d)-1)
∑i=1n∑j=1m(n+1−i)(m+1−j)(∑d∣gcd(i,j)ϕ(d)−1)。
因为
ϕ
(
1
)
=
1
\phi(1)=1
ϕ(1)=1,所以我们可以把这一项提出来消去后面的
1
1
1,变为
∑
i
=
1
n
∑
j
=
1
m
(
n
+
1
−
i
)
(
m
+
1
−
j
)
∑
d
∣
g
c
d
(
i
,
j
)
d
≠
1
ϕ
(
d
)
\sum_{i=1}^{n}\sum_{j=1}^{m}(n+1-i)(m+1-j)\sum_{d|gcd(i,j)}^{d\ne1}\phi(d)
∑i=1n∑j=1m(n+1−i)(m+1−j)∑d∣gcd(i,j)d=1ϕ(d)。
再来看这个枚举的d,我们是在枚举
i
,
j
i,j
i,j最大公约数的约数,那就是枚举
i
,
j
i,j
i,j的所有公约数,那就可以换一个思路,一个数
d
d
d作为公约数被计算到,只需要将其分别扩大
i
i
i倍和
j
j
j倍,即枚举所有的
d
d
d,再将其扩大
i
i
i倍与
j
j
j倍,将d作为其公约数进行计算,所以对式子进行变形
∑
d
=
2
min
(
n
,
m
)
∑
i
=
1
⌊
n
d
⌋
∑
j
=
1
⌊
m
d
⌋
(
n
+
1
−
i
d
)
(
m
+
1
−
j
d
)
ϕ
(
d
)
\sum_{d=2}^{\min(n,m)}\sum_{i=1}^{\lfloor{\frac{n}{d}}\rfloor}\sum_{j=1}^{\lfloor{\frac{m}{d}}\rfloor}(n+1-id)(m+1-jd)\phi(d)
∑d=2min(n,m)∑i=1⌊dn⌋∑j=1⌊dm⌋(n+1−id)(m+1−jd)ϕ(d)。
将互不干扰的部分拆开,得到
∑
d
=
2
min
(
n
,
m
)
ϕ
(
d
)
∑
i
=
1
⌊
n
d
⌋
(
n
+
1
−
i
d
)
∑
j
=
1
⌊
m
d
⌋
(
m
+
1
−
j
d
)
\sum_{d=2}^{\min(n,m)}\phi(d)\sum_{i=1}^{\lfloor{\frac{n}{d}}\rfloor}(n+1-id)\sum_{j=1}^{\lfloor{\frac{m}{d}}\rfloor}(m+1-jd)
∑d=2min(n,m)ϕ(d)∑i=1⌊dn⌋(n+1−id)∑j=1⌊dm⌋(m+1−jd)。
现在前一项可以
O
(
n
)
O(n)
O(n)预处理得到,那么就对后两项进行处理,发现后两项显然是等差数列形式,以
n
n
n项为例,对其求和。
首项:
n
−
d
+
1
n-d+1
n−d+1
末项:
n
+
1
−
⌊
n
d
⌋
×
d
=
n
m
o
d
d
+
1
n+1-\lfloor{\frac{n}{d}}\rfloor\times d=n \bmod d+1
n+1−⌊dn⌋×d=nmodd+1
项数:
⌊
n
d
⌋
\lfloor{\frac{n}{d}}\rfloor
⌊dn⌋
故
∑
i
=
1
⌊
n
d
⌋
(
n
+
1
−
i
d
)
=
(
n
−
d
+
1
+
n
m
o
d
d
+
1
)
×
⌊
n
d
⌋
2
\sum_{i=1}^{\lfloor{\frac{n}{d}}\rfloor}(n+1-id)=\frac{(n-d+1+n\bmod d+1)\times{\lfloor{\frac{n}{d}}\rfloor}}{2}
∑i=1⌊dn⌋(n+1−id)=2(n−d+1+nmodd+1)×⌊dn⌋
对m同理,式子最终化为
∑
d
∣
n
min
(
n
,
m
)
ϕ
(
d
)
(
n
−
d
+
n
m
o
d
d
+
2
)
(
m
−
d
+
m
m
o
d
d
+
2
)
4
\frac{\sum_{d|n}^{\min(n,m)}\phi(d)(n-d+n\bmod d+2)(m-d+m\bmod d+2)}{4}
4∑d∣nmin(n,m)ϕ(d)(n−d+nmodd+2)(m−d+mmodd+2)
成功优化至
O
(
n
)
。
O(n)。
O(n)。
T7:
贪心,考试的时候没写(去推上面那个题了),考完发现我三年前的代码竟然在没spj的aoj上过了,震惊。
对连续两项
(
a
1
,
b
1
)
,
(
a
2
,
b
2
)
(a_1,b_1),(a_2,b_2)
(a1,b1),(a2,b2)分析,前项在前的时间为
a
1
+
b
2
+
max
(
a
2
,
b
1
)
a_1+b_2+\max(a_2,b_1)
a1+b2+max(a2,b1),后项在前时间为
a
2
+
b
1
+
max
(
a
1
,
b
2
)
a_2+b_1+\max(a_1,b_2)
a2+b1+max(a1,b2),若前项在前更优,则有
a
1
+
b
2
+
max
(
a
2
,
b
1
)
<
a
2
+
b
2
+
max
(
a
1
,
b
2
)
a_1+b_2+\max(a_2,b_1)<a_2+b_2+\max(a_1,b_2)
a1+b2+max(a2,b1)<a2+b2+max(a1,b2),移项得
a
1
+
b
2
−
max
(
a
1
,
b
2
)
<
a
2
+
b
1
−
max
(
a
2
,
b
1
)
a_1+b_2-\max(a_1,b_2)<a_2+b_1-\max(a_2,b_1)
a1+b2−max(a1,b2)<a2+b1−max(a2,b1),发现最大项被减掉了,所以得到
min
(
a
1
,
b
2
)
<
min
(
a
2
,
b
1
)
\min(a_1,b_2)<\min(a_2,b_1)
min(a1,b2)<min(a2,b1)。我们以这个来排序就做完了。。。。。。
但据dl所说,这个式子不满足不等比性的传递性,所以不能直接用这个式子排序。(详见浅谈邻项交换排序的应用以及需要注意的问题)
所以我们对这个式子进一步分析,发现这个式子可以根据
a
,
b
a,b
a,b大小进行分类:
1.
a
1
<
b
1
a_1<b_1
a1<b1且
a
2
<
b
2
a_2<b_2
a2<b2时,根据
a
1
<
a
2
a_1<a_2
a1<a2排序。
2.
a
1
=
b
1
a_1=b_1
a1=b1且
a
2
=
b
2
a_2=b_2
a2=b2时,可随意排序。
3.
a
1
>
b
1
a_1>b_1
a1>b1且
a
2
>
b
2
a_2>b_2
a2>b2时,根据
b
1
>
b
2
b_1>b_2
b1>b2排序。
因为优先找
a
a
a比
b
b
b小的,所以设计判定函数
d
i
d_i
di:
d
i
=
{
−
1
a
i
<
b
i
0
a
i
=
b
i
1
a
i
>
b
i
d_i= \begin{cases} -1 & a_i<b_i \\ 0 & a_i=b_i \\ 1 & a_i>b_i \end{cases}
di=⎩⎪⎨⎪⎧−101ai<biai=biai>bi
以
d
i
d_i
di为第一关键字,相等再按上述
a
,
b
a,b
a,b条件排序,模拟计算出时间即可。
T8:
数学题,据说有用三分的,tqlorz。
设人距离左边墙长度为
d
d
d,影长为
l
l
l。
分类,首先是影子全在地上的情况,即
d
×
H
H
−
h
<
=
D
d\times\frac{H}{H-h}<=D
d×H−hH<=D时,根据相似得
l
=
d
×
H
H
−
h
−
d
=
d
×
h
H
−
h
l=d\times \frac{H}{H-h}-d=d\times\frac{h}{H-h}
l=d×H−hH−d=d×H−hh,随
d
d
d单调上升,所以当影子抵到右墙底时,即
d
=
D
×
H
−
h
H
d=D\times \frac{H-h}{H}
d=D×HH−h时,影长最长
l
max
=
D
×
h
H
l_{\max}=D\times \frac{h}{H}
lmax=D×Hh。
然后是影子挂墙上的情况,即 d × H H − h > D d\times\frac{H}{H-h}>D d×H−hH>D且 d < = D d<=D d<=D时,延长出去,根据相似可得 d ′ = d × H H − h d'=d\times \frac{H}{H-h} d′=d×H−hH,再根据相似得 L h = d ′ − D d ′ − d \frac{L}{h}=\frac{d'-D}{d'-d} hL=d′−dd′−D,化简得 L = H − D ( H − h ) d L=H-\frac{D(H-h)}{d} L=H−dD(H−h),加上地上的影子得 l = D + H − D ( H − h ) d − d l=D+H-\frac{D(H-h)}{d}-d l=D+H−dD(H−h)−d,欲求 l max l_{\max} lmax,则使后两项最小,显然后两项为对钩函数,取最低点得当 d = D ( H − h ) d=\sqrt{D(H-h)} d=D(H−h)时, l max = D + H − 2 D ( H − h ) l_{\max}=D+H-2\sqrt{D(H-h)} lmax=D+H−2D(H−h),这个值显然是比第一种情况的值大的,代入计算就做出这道题啦。
然后你去算就会发现3个样例两个过不了。
然而你的d是有范围的。超范围就要分类讨论。
当
D
(
H
−
h
)
>
D
⇒
H
−
h
>
D
\sqrt{D(H-h)}>D\Rightarrow H-h>D
D(H−h)>D⇒H−h>D时,也就是人站墙里面了,那这时
d
d
d应该取
D
D
D,此时
l
max
=
h
l_{\max}=h
lmax=h。
当
d
′
<
D
⇒
D
(
H
−
h
)
>
H
d'<D\Rightarrow \sqrt{D(H-h)}>H
d′<D⇒D(H−h)>H时,也就是影子到墙根里去了,那这时应该取情况1的答案,即
l
max
=
D
×
h
H
l_{\max}=D\times \frac{h}{H}
lmax=D×Hh。
答案完备
l
max
=
{
h
H
−
h
>
D
D
×
h
H
D
(
H
−
h
)
>
H
D
+
H
−
2
D
(
H
−
h
)
else
l_{\max}= \begin{cases} h &H-h>D \\ D\times \frac{h}{H} & \sqrt{D(H-h)}>H \\ D+H-2\sqrt{D(H-h)} & \text{else} \end{cases}
lmax=⎩⎪⎨⎪⎧hD×HhD+H−2D(H−h)H−h>DD(H−h)>Helse
总结:难度上升了,摩多摩多。