与正解的差距
T1
首先,暴力没打好我的锅(哭了)
30分枚举每一个点做中间点,然后对于每个x f[i][j]表示度数为i,gcd为j时的答案,这个转移可做
45分发现d[x]<k的点是不能作为中间点的,把这个跳过,然后就能优化特别大的复杂度!
发现式子是先找一个中间点,然后枚举k条长度为(1~maxx)的链,要使这些长度gcd=1,然后把这些链出现的次数乘起来,求累加和,也就是对于每个x,求
∑
a
1
=
1
m
a
x
x
∑
a
2
=
1
m
a
x
x
.
.
.
.
.
.
∑
a
k
=
1
m
a
x
x
c
n
t
[
a
1
]
×
c
n
t
[
a
2
]
×
.
.
.
.
.
.
c
n
t
[
a
k
]
(
g
c
d
(
a
1
,
a
2......
a
k
)
=
1
)
\sum_{a1=1}^{maxx}\sum_{a2=1}^{maxx}......\sum_{ak=1}^{maxx}cnt[a1]\times cnt[a2]\times ......cnt[ak] \;(gcd(a1,a2......ak)=1)
a1=1∑maxxa2=1∑maxx......ak=1∑maxxcnt[a1]×cnt[a2]×......cnt[ak](gcd(a1,a2......ak)=1)
发现有gcd,是可以进行莫比乌斯反演的,所以就变成了
∑
d
=
1
l
i
m
μ
(
d
)
∑
a
1
∣
d
∑
a
2
∣
d
.
.
.
.
.
.
∑
a
k
∣
d
c
n
t
[
a
1
]
×
c
n
t
[
a
2
]
×
.
.
.
.
.
.
c
n
t
[
a
k
]
\sum _{d=1}^{lim}\mu(d)\sum_{a1|d}\sum_{a2|d}......\sum_{ak|d} cnt[a1]\times cnt[a2]\times ......cnt[ak]
d=1∑limμ(d)a1∣d∑a2∣d∑......ak∣d∑cnt[a1]×cnt[a2]×......cnt[ak]
这个莫比乌斯反演的应用可以学习,在求cnt的时候,用的树形dp,分成两部分,一部分是自己子树内的,一部分是子树外的,这个套路挺常见的,应该能想到
T2
打表的时候把一个数字写错了,自闭,导致没分了
刚开始还在想怎么搞dfs,后来直接放弃打表了,但是赛后经提点,原来很简单,确定一个数为底数,所有数都往他上放,统计所有情况,但是需要把原序列变换一下位置再做,跑得飞快,有50分,哭了
正解其实用到了一个折半的思想,把前三个数的所有可能情况搞出来,后三个数的搞出来,然后从那个里面找答案,感觉确实是折半好题,就是代码量太大,操作的实现比较不容易,不过也对折半更熟悉了一些
T3
暴力只需要维护每一列最下面的块的位置和最上面的块的位置,考试的时候有一瞬间觉得自己维护的不对,但是真的来不及改了,现在想想确实,和中间的没关系,确定个框架就行了
如果能写出暴力,应该就能打表发现对应位置是一个等差数列,然后就有35分了(然而暴力都不会我不配)