[SDOI2017]序列计数
发现至少有一个数是质数不是很好办,考虑用全部的减去没有一个质数的
令
f
x
f_x
fx表示当前模p余x的方案数,然后转移是一个卷积,因为p很小,上一个快速幂+暴力卷积就可以过了
然后没有一个质数的初值就是
f
x
%
p
=
1
(
x
∉
P
)
f_{x\%p}=1(x\notin P)
fx%p=1(x∈/P),总的个数的话全部设成1就可以了
[SDOI2017]树点涂色
发现将x到根的路径全部染色有一点像一个 access,一个 splay 代表的就是一种颜色
然后第二种询问可以差分一下,转换为求一个点到根经过的颜色个数
就是 access 时切换的次数
关于第3个询问,考虑 access 时对答案的影响,就是一棵子树中的答案全部减1,一棵+1,access 的时候类似LCT维护子树操作更新,再套一个dfs序维护就可以了
[SDOI2017]数字表格
a
n
s
=
∏
d
=
1
n
f
[
d
]
∑
i
∑
j
[
g
c
d
(
i
,
j
)
=
d
]
ans=\prod _{d=1}^nf[d]^{ \sum_i \sum_j [gcd(i,j)=d]}
ans=d=1∏nf[d]∑i∑j[gcd(i,j)=d]
里面的东西:
∑
i
n
∑
j
m
[
g
c
d
(
i
,
j
)
=
d
]
\sum_i^n \sum_j^m [gcd(i,j)=d]
i∑nj∑m[gcd(i,j)=d]
=
∑
i
n
/
d
∑
j
m
/
d
∑
l
∣
g
c
d
(
i
,
j
)
μ
(
l
)
=\sum_i ^{n/d} \sum_j^{m/d} \sum_{l|gcd(i,j)} \mu (l)
=i∑n/dj∑m/dl∣gcd(i,j)∑μ(l)
=
∑
l
=
1
n
/
d
μ
(
l
)
⌊
n
l
d
⌋
⌊
m
l
d
⌋
=\sum_{l=1}^{n/d} \mu(l) \left \lfloor \frac{n}{ld}\right \rfloor \left \lfloor \frac{m}{ld}\right \rfloor
=l=1∑n/dμ(l)⌊ldn⌋⌊ldm⌋
a
n
s
=
∏
d
=
1
n
f
[
d
]
∑
l
=
1
n
/
d
μ
(
l
)
⌊
n
l
d
⌋
⌊
m
l
d
⌋
ans=\prod _{d=1}^nf[d]^{ \sum_{l=1}^{n/d} \mu(l) \left \lfloor \frac{n}{ld}\right \rfloor \left \lfloor \frac{m}{ld}\right \rfloor}
ans=d=1∏nf[d]∑l=1n/dμ(l)⌊ldn⌋⌊ldm⌋
=
∏
T
=
1
n
(
∏
d
∣
T
f
[
d
]
μ
(
T
d
)
)
⌊
n
T
⌋
⌊
m
T
⌋
=\prod _{T=1}^n (\prod_{d|T} f[d]^{\mu(\frac{T}{d})} )^{ \left \lfloor \frac{n}{T}\right \rfloor \left \lfloor \frac{m}{T}\right \rfloor}
=T=1∏n(d∣T∏f[d]μ(dT))⌊Tn⌋⌊Tm⌋
然后预处理前面一坨,整除分块
[SDOI2017]新生舞会
分数规划+费用流
[SDOI2017]硬币游戏
记
P
0
P_0
P0为非终止状态的概率
P
i
P_i
Pi为 i 获胜的概率
i 获胜可以从一个非终止状态+它本身的串来获胜,但是在生成它之前可能已经被它的前缀给占了
于是要减去先生成它的前缀的概率,最后加上一个
∑
p
(
i
)
=
1
\sum p (i)=1
∑p(i)=1就可以高斯消元
[SDOI2017]相关分析
直接把平均数拆开带进去,发现要维护
∑
x
i
y
i
\sum x_iy_i
∑xiyi
∑
x
i
2
\sum x_i^2
∑xi2
∑
x
i
\sum x_i
∑xi
∑
y
i
\sum y_i
∑yi
然后第3个修改比较头疼,考虑先重新赋值,再一起加上S,T就是可以了
[SDOI2017]遗忘的集合
考虑如果知道集合怎么求
f
f
f
构造生成函数,
f
(
i
)
=
∑
j
=
0
i
n
f
x
i
j
=
1
1
−
x
i
f(i)=\sum_{j=0}^{inf}x^{ij}=\frac{1}{1-x^i}
f(i)=∑j=0infxij=1−xi1
那么如果用
t
i
t_i
ti表示有没有出现,答案的生成函数就是
f
=
∑
i
=
1
i
n
f
(
1
1
−
x
i
)
t
i
f=\sum _{i=1}^{inf}(\frac{1}{1-x^i})^{t_i}
f=∑i=1inf(1−xi1)ti
现在晓得 f,要求 t
两边取对数,
−
l
n
(
f
)
=
∑
i
=
1
i
n
f
t
i
∗
l
n
(
1
−
x
i
)
-ln(f)=\sum_{i=1}^{inf}t_i*ln(1-x^i)
−ln(f)=∑i=1infti∗ln(1−xi)
考虑化简
l
n
(
1
−
x
i
)
ln(1-x^i)
ln(1−xi) ,先求导
l
n
′
(
1
−
x
i
)
=
−
i
∗
x
i
−
1
1
−
x
i
ln'(1-x^i)=\frac{-i*x^{i-1}}{1-x^i}
ln′(1−xi)=1−xi−i∗xi−1
直接暴力展开
−
i
∗
x
i
−
1
1
−
x
i
=
(
−
i
∗
x
i
−
1
)
∗
∑
j
=
0
i
n
f
x
i
j
=
∑
j
=
0
i
n
f
−
i
∗
x
i
∗
j
+
i
−
1
\frac{-i*x^{i-1}}{1-x^i}=(-i*x^{i-1})*\sum_{j=0}^{inf}x^{ij}=\sum_{j=0}^{inf}-i*x^{i*j+i-1}
1−xi−i∗xi−1=(−i∗xi−1)∗∑j=0infxij=∑j=0inf−i∗xi∗j+i−1
积分回去
=
∑
j
=
0
i
n
f
−
i
∗
x
i
∗
(
j
+
1
)
i
∗
(
j
+
1
)
=
−
∑
j
=
1
i
n
f
x
i
∗
j
j
=\sum_{j=0}^{inf}\frac{-i*x^{i*(j+1)}}{i*(j+1)}=-\sum_{j=1}^{inf}\frac{x^{i*j}}{j}
=∑j=0infi∗(j+1)−i∗xi∗(j+1)=−∑j=1infjxi∗j
那么原式就是
l
n
(
f
)
=
∑
i
=
1
i
n
f
t
i
∗
∑
j
=
1
i
n
f
x
i
∗
j
j
=
∑
T
=
1
i
n
f
x
T
∗
∑
l
∣
T
t
l
∗
l
T
ln(f)=\sum_{i=1}^{inf}t_i*\sum_{j=1}^{inf}\frac{x^{i*j}}{j}=\sum_{T=1}^{inf}x^T*\sum_{l|T}t_l*\frac{l}{T}
ln(f)=∑i=1infti∗∑j=1infjxi∗j=∑T=1infxT∗∑l∣Ttl∗Tl
那么将 f 取 ln,然后调和级数算一下贡献就可以了