bzoj5302: [Haoi2018]奇怪的背包
∑
a
i
x
i
=
c
a
l
\sum a_ix_i = cal
∑aixi=cal
需要满足
g
c
d
(
a
1
,
a
2
,
.
.
.
,
a
n
)
∣
c
a
l
gcd(a_1,a_2,...,a_n)|cal
gcd(a1,a2,...,an)∣cal
这里对
p
p
p取模可以看作减去
p
∗
x
p*x
p∗x
那么一个方案
a
1
,
a
2
,
.
.
,
a
n
a_1,a_2,..,a_n
a1,a2,..,an合法只需要知道他们与
p
p
p的
g
c
d
gcd
gcd是
x
x
x的因数
先预处理
f
[
i
]
f[i]
f[i]表示是
p
p
p的第
i
i
i个因数的倍数的数有多少个
简单容斥可以得到
g
[
i
]
g[i]
g[i]表示
g
c
d
=
i
gcd=i
gcd=i的数对有多少对
复杂度通过子集倍数积可
n
2
n^2
n2得到
回答套一个map就可以
l
o
g
log
log做了
bzoj5303: [Haoi2018]反色游戏
假设是一棵树那么会怎么样
那么要么只有唯一解,要么无解
用一个叶子点的父亲随意推一下可以知道,只需要这棵树的点权异或为
0
0
0那么有唯一解
推广到图上,我们发现一条非树边的取值是不会影响这棵树的点权异或和,因为如果取了1那么连接的两个点都会异或1,异或和不变。反之同理
所以对于一个连通块判完合法直接就是
2
m
2^{m}
2m,其中
m
m
m为非树边数量
对于删除,tarjan一下搞出点双随意乱搞就出来了
bzoj5304: [Haoi2018]字串覆盖
以
r
−
l
=
50
r-l=50
r−l=50作为分界点讨论
对于
r
−
l
>
50
r-l>50
r−l>50的,发现他们的合法状态不会很多,那就直接暴力找第一个然后暴力主席树+SA跳
对于
r
−
l
<
=
50
r-l<=50
r−l<=50的,显然需要预处理
那么这时候不能一次性处理完
50
50
50类状态,大概是因为空间太大了跑不动?
询问离线再做状态
做的过程只需要让每个
i
i
i找到后面第一个合法且不与他重叠的位置
这个同样用
S
A
SA
SA二分+主席树实现
发现这其实是一棵树,写一个倍增就优越了
loj跑不动,bz勉强卡过去了
bzoj5305: [Haoi2018]苹果树
以前做过
今天推一下发现以前简直是sb…
贴个以前的题解吧