2021.12.18省选模拟
t1 还不会
t2 正解:设 s u m 1 sum1 sum1表示 c i , j = a i c_{i,j}=a_i ci,j=ai的个数, s u m 2 sum2 sum2表示 c i , j = b j c_{i,j}=b_j ci,j=bj的个数, x x x为 a i = 1 a_i=1 ai=1的个数, y y y为 b i = 1 b_i=1 bi=1的个数,不难得到当 s u m 1 + s u m 2 − x y − ( n − x ) ( n − y ) = n 2 sum1+sum2-xy-(n-x)(n-y)=n^2 sum1+sum2−xy−(n−x)(n−y)=n2时, a a a与 b b b合法,后面的减法是去掉重复用的,而且不管怎么选,都有 s u m 1 + s u m 2 − x y − ( n − x ) ( n − y ) ≤ n 2 sum1+sum2-xy-(n-x)(n-y)\le n^2 sum1+sum2−xy−(n−x)(n−y)≤n2,所以对于一组确定的 x , y x,y x,y,我们要使 s u m 1 + s u m 2 sum1+sum2 sum1+sum2最大,然后求出方案数求和, d p dp dp即可,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
t3 正解:
B
B
B树颜色数+
A
A
A树颜色数-在两棵树上同时存在的颜色数即为答案,考虑如何求
B
B
B树颜色数,显然对于每种颜色我们只用考虑在子树中它的最小深度,设
s
u
m
i
sum_i
sumi表示在子树种最小深度为
i
i
i的颜色个数,答案就可以用一个区间和得到,
s
u
m
i
sum_i
sumi可以用主席树存,更新的时候可以用启发式合并,就是继承重儿子主席树,用轻儿子更新,时间复杂度为
O
(
n
log
2
n
)
O(n\log^2 n)
O(nlog2n)
因为
A
A
A树结点很少,可以暴力跑,后面那个离线将
A
A
A树每个点颜色的最小深度求出来就可以了
2021.12.24省选模拟
t1 枚举相对大小关系,中间的就是中位数,其他两个相当于有一个不等式来限制取值,时间复杂度
O
(
6
n
)
O(6^n)
O(6n)
正解:不难发现,如果有解,那么一定可以构造出一组每个数的值都为与它有关的中位数的值,考虑一组
a
,
b
,
c
a,b,c
a,b,c的中位数是
d
d
d的条件,
a
<
b
→
b
≥
d
,
c
≥
d
a<b\rightarrow b\geq d,c\geq d
a<b→b≥d,c≥d大于同理,对于
b
b
b和
c
c
c也同理,设
x
(
i
,
v
)
x(i,v)
x(i,v)表示第
i
i
i个数选出的数是否大于等于
v
v
v,如果大于等于
v
v
v则为
1
1
1,否则为
0
0
0,这样问题就变成了一个
2
−
s
a
t
2-sat
2−sat问题
t2 感觉像是容斥,但有交集的不合法串不知道怎么算方案数,而且没时间写暴力了
t3 设 g i g_i gi表示第 i i i点往左走最前能走完一个完整区间的点,那贡献就变成了一直往左跳,最多能跳到什么地方,每次加边相当于给 g g g取区间 max \max max,线段树不好做,考虑分块,由于 g g g是递增的,所以区间取 max \max max可以看成区间赋值,可以用一个区间标记完成,再维护每个点往左跳最左能跳到块内的哪个点和到那个点的距离,然后就可以做到 O ( n n ) O(n\sqrt n) O(nn)了,听说正解是 L C T LCT LCT
2022.1.8省选模拟
t1 发现只要问题就是要维护两个点的距离,本来想离线,但是发现要强制在线,要用
L
C
T
LCT
LCT,好久没写了,一个板子调了一个多小时
t2 背包问题,但是重量<=300,考虑将背包按质量分组,发现一种质量为
i
i
i的物品,最多用
⌊
k
i
⌋
\lfloor \frac{k}{i}\rfloor
⌊ik⌋次,而且只会取价值最大的前几个,在设定一些阈值就可以水到
55
55
55分
正解:设
s
i
,
j
s_{i,j}
si,j表示第
i
i
i组最大的
j
j
j个的价值和,
s
i
s_i
si一定是一个关于
j
j
j的上凸函数,所以在分组背包时,对于
%
i
\%i
%i相同的价值的决策点单调,用一个单调队列维护决策点即可,每次二分寻找决策点改变的地方,时间复杂度为
O
(
300
k
log
k
)
O(300k\log k)
O(300klogk)
t3 直接写暴力
2022.1.20 NOI2022冬令营热身赛
t1 看数据范围就像区间
d
p
dp
dp,设
f
i
,
j
f_{i,j}
fi,j表示把
i
i
i到
j
j
j的点全部覆盖需要的矩形数,转移时枚举高度
h
h
h把整个区间
i
∼
j
i\sim j
i∼j都覆盖,然后大于
h
h
h的连续段分别用
f
f
f来算出最小矩形,感觉没什么问题,但交上去却
w
a
wa
wa了,看了题解后发现做法假了,事实上大于
h
h
h的连续段如果综合考虑可能会更优
正解:多设一维
h
h
h,
f
i
,
j
,
h
f_{i,j,h}
fi,j,h表示把区间
i
∼
j
i\sim j
i∼j中高度大于等于
h
h
h的点都给覆盖的最小矩阵数
t2 题意理解困难
正解:假设以及确定塔的顺序
{
p
n
}
\{p_n\}
{pn},先让塔尽量靠近,求出最短长度
x
x
x,考虑往里面加入空格得到最终的方案,不难发现方案数为
(
l
−
x
+
n
n
)
\binom{l-x+n}{n}
(nl−x+n),设
f
i
,
j
,
k
f_{i,j,k}
fi,j,k表示枚举到了第
i
i
i个塔,现有
j
j
j个可以插入的区间,已经确定的长度
k
k
k,考虑当前插入的塔
i
i
i是大于两边的塔,还是小于两边的塔,还是大于其中一边,小于其中一边,分别计算贡献,至于
(
l
−
x
+
n
n
)
\binom{l-x+n}{n}
(nl−x+n),由于
(
n
m
)
=
(
n
−
1
m
)
+
(
n
−
1
m
−
1
)
\binom{n} {m}=\binom{n-1}{m}+\binom{n-1}{m-1}
(mn)=(mn−1)+(m−1n−1),所以可以用矩乘求
t3 一看题目的
4
s
4s
4s时限就感觉是分块,但是很多关键步骤没想到怎么处理,只好写暴力
正解:点与点之间的可达性可以用
b
i
t
s
e
t
bitset
bitset来处理,操作一定期重构,对操作二进行分块,每次要求出一段操作二对一个点的影响,感觉实现起来非常困难
2022.1.21省选模拟
t1 又是不懂题意,只根据样例输出了一个
−
1
-1
−1
正解:其实题意就是要长度为
l
l
l的路径数要是一个关于
l
l
l的多项式,然后所有
l
l
l的多项式的最高次项的最大值就是
k
k
k,考虑判断
−
1
-1
−1,其实就是要判断路径数是否是一个关于
l
l
l的多项式,这个判断一下一个点能否有两条及以上的路径能够走回自己,如果有的话,那每次都能通过不同的方式走回自己,这样一定是指数级别的,不可能是多项式,考虑求
k
k
k,
t
a
r
j
a
n
tarjan
tarjan缩点后,由于每个点没有两种方式走回自己,那缩起来的强连通分量一定是个简单环,首先抛出结论,
k
k
k为缩点后的一条包含最多环的路径的环的个数
−
1
-1
−1,除了最后一个环,每个环都可以枚举走多少遍这个环,都是
O
(
L
)
O(L)
O(L)级别的,那最后一个环走的次数肯定就确定了,所以环的个数
−
1
-1
−1即为多项式的最高次项
t2 不是很会,感觉是
S
A
M
SAM
SAM或
S
A
SA
SA,只会一个
O
(
n
2
log
n
)
O(n^2\log n)
O(n2logn)的做法
正解:果然是
S
A
M
SAM
SAM,不会,赶紧跑去学
t3 比赛时想到
d
p
dp
dp,想到折线
d
p
dp
dp,但是找到了反例,发现假了,就没敢写
正解:还不会,只会一个假的
d
p
dp
dp,果然比赛时想到的
d
p
dp
dp很能水,事实证明假的算法也可以考虑写一写
设
f
1
i
,
j
f1_{i,j}
f1i,j表示只考虑
1
∼
i
,
1
∼
j
1\sim i,1\sim j
1∼i,1∼j的矩形,从上走,从左走的最大价值,
f
2
,
f
3
,
f
4
f2,f3,f4
f2,f3,f4同理,左边和右边考虑一下合并,中间空的就去最大值和次大值加起来,上下也这样做一遍,就能切了,事实上少考虑了一种情况,上下左右缠在一起的情况没有考虑到,并不太会处理,不过感觉这题似乎很可以退火
2022.1.24A&B组模拟
省选太难,干不动,跑来打A组
t1 直接建图,跑就完了
t2 离散化,开 2 n 2n 2n个 s e t set set,分别维护,每一行的树的横坐标,和每一列树的纵坐标,把矩阵删除拆成 4 4 4部分,分别在 s e t set set上把它们删除,顺便记下答案,由于每棵树只会被删一次,所以时间复杂度为 n log n n\log n nlogn
t3 比赛时以为要缩点,想复杂了,没敢写
正解:考虑原图的搜索树,求出每个点的
d
f
n
dfn
dfn和
l
o
w
low
low,考虑删一条边
p
,
q
p,q
p,q,如果
p
,
q
p,q
p,q为返祖边,那么一定不可能影响连通性,假定
p
p
p为父亲,如果
l
o
w
q
≤
d
f
n
p
low_{q}\le dfn_{p}
lowq≤dfnp,那么说明
q
q
q可以通过其它的点绕到
p
p
p上,同样不影响图的连通性,否则判断该边是否在
x
x
x和
y
y
y的路径上,删点有点复杂,如果
x
x
x不在
p
p
p的子树内,那么
x
x
x一定与根相连,否则一直向上跳,跳到一个最接近
p
p
p的点,也就是
p
p
p的一个儿子
z
z
z,如果
l
o
w
z
<
d
f
n
p
low_{z}<dfn_{p}
lowz<dfnp,说明
x
x
x依旧能到达根,
y
y
y同理,如果两个点都能到达根,或两个点的
z
z
z相同,说明这两个点连通
t4 一看这道题就是暴搜+剪枝,剪了半个多小时,吸氧拿到了
70
p
t
s
70pts
70pts
正解:
优化
1
1
1:考虑已经确定了
1
∼
h
1\sim h
1∼h的
A
A
A点会变成那些
B
B
B点,对于每个
A
A
A点算出它在
h
+
1
∼
n
h+1\sim n
h+1∼n还有多少条连边,假设
k
k
k条,考虑给这些边一个估价,由于已经确定其
B
B
B点,算出
B
B
B点未连边的前
k
k
k小加起来,这个可以通过预处理
f
i
,
s
,
j
f_{i,s,j}
fi,s,j,表示第
i
i
i个
B
B
B点,与
s
s
s中的
B
B
B点的连边的前
j
j
j小的和
优化
2
2
2:把点按入度排序,大的先跑,小的后跑
两个优化加上就能过了
2022.2.9省选模拟
t1 考试时看错题,以为能切,写出来大样例过不了,想了好久才发现看错题了
正解:考虑把连续不间断的行看成一个点,连续不间断的列看成一个点,往每个点流
i
i
i的流量相当于在这个行或列上放置
i
i
i个棋子,贡献显然为
i
(
i
−
1
)
2
\frac{i(i-1)}{2}
2i(i−1),并不是熟悉的一次函数,不能直接套费用流,考虑拆边,一条流量为
k
k
k的边,拆成
k
k
k条边,流量均为
1
1
1,费用为
0
0
0到
k
−
1
k-1
k−1,在这两个点之间流量为
n
n
n时,由于要使费用最小,肯定用费用为
0
0
0到
n
−
1
n-1
n−1的边,总费用即为
n
(
n
−
1
)
2
\frac{n(n-1)}{2}
2n(n−1),符合题目要求
t2 一看到这种树同构问题就要想到树哈希,考虑求答案的过程,二分答案 k k k,然后求出每个点 k k k子树的树哈希值,判断是否有相同的,难点就在如何快速求出每个点 k k k子树的树哈希值,普通的树哈希方法似乎比较困难,于是自行 y y yy yy哈希方法,这个哈希方法要支持从树中删除与子树根距离为 k + 1 k+1 k+1的点的贡献,经过思索,发现这样一种哈希方式是合适的,设每个点的哈希值为 h u h_u hu, h u = ∑ h s o n i ⋅ i b i + 1 h_u=\sum h_{son_i}\cdot ib^{i+1} hu=∑hsoni⋅ibi+1, b b b是钦定的常数,题解的做法看的不是很懂
t3 没有细看,赛后发现是道水题,但听说需要卡常
正解:求出
f
f
f的通项公式
f
(
n
)
=
c
1
(
−
1
)
n
+
c
2
3
n
f(n)=c_1(-1)^n+c_{2}3^n
f(n)=c1(−1)n+c23n,前面和后面分别进行求和,直接
n
t
t
ntt
ntt即可,但是模数很奇怪,要多模
n
t
t
ntt
ntt,不想写
2022.2.10 xjoi IOI选拔决赛前训练4
t1 想到一个
O
(
s
i
z
+
n
ω
(
n
)
)
O(siz+n\omega(n))
O(siz+nω(n))的做法,以为能过,写了一发测了一下大样例,发现可能会被卡,结果真被卡了,赛后多交了几遍就
A
A
A了
t2 奇怪概率题,不会
t3 看了好久题目,写了个暴力也发现不对,手玩了小样例发现手玩不出答案,一测大样例竟然过了,不过跑了很久
2022.2.11省选模拟
t1 赛时想到一个
O
(
n
5
)
O(n^5)
O(n5)的
d
p
dp
dp,没有调出来
正解:容易发现答案只有可能由一个卷或两个卷拼接而成,设
f
x
1
,
y
1
,
x
2
,
y
2
,
0
/
1
,
0
/
1
/
2
/
3
f_{x1,y1,x2,y2,0/1,0/1/2/3}
fx1,y1,x2,y2,0/1,0/1/2/3表示在矩阵
x
1
,
y
1
,
x
2
,
y
2
x1,y1,x2,y2
x1,y1,x2,y2中,逆时针或顺时针卷,出发点在左上或左下或右上或右下的最大答案
t2 奇怪几何题,不会
t3 不会
正解:先不考虑标号,求出
f
i
f_i
fi表示有
i
i
i个有用的苹果的方案数,观察一棵树是合法的当且仅当满足一下
4
4
4个条件
1.
1.
1.每个有用的苹果可以与除没用的苹果之外的所有苹果连边
2.
2.
2.每个坏的苹果可以与所有苹果连边
3.
3.
3.每个无用的苹果只能与坏的苹果连边
4.
4.
4.每个有用的苹果至少与一个有用的苹果相连
第四个条件处理起来比较麻烦,先不管它,求出
g
i
g_i
gi表示至多有
i
i
i个有用的方案数,这个可以通过矩阵树定理求出,然后容斥求出
f
i
f_i
fi
f
i
=
{
g
0
(
i
=
0
)
g
i
−
∑
j
=
0
i
(
i
j
)
f
j
(
i
>
0
)
f_i=\begin{cases}g_0\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (i=0)\\g_i-\sum_{j=0}^i\tbinom{i}{j}f_j\ (i>0)\end{cases}
fi={g0 (i=0)gi−∑j=0i(ji)fj (i>0)
回到
l
i
m
i
t
limit
limit的限制,只要求出
h
i
h_i
hi表示有
i
i
i个选出
i
i
i个有用苹果且和小于
l
i
m
i
t
limit
limit的方案数,就可以得到
a
n
s
=
∑
h
i
f
i
ans=\sum h_if_i
ans=∑hifi了,第一个想法就是搜索,但是
2
40
2^{40}
240不太行,用折半搜索即可
t4 难,连普通带修都不会做
正解:先考虑带修的怎么做,求出
p
r
e
i
pre_i
prei表示前面与
i
i
i相同的第一个位置,一次询问的答案就是
∑
i
=
l
r
i
−
max
(
l
−
1
,
max
l
≤
j
≤
r
p
r
e
j
)
\sum_{i=l}^ri-\max(l-1,\max_{l\le j\le r}pre_j)
∑i=lri−max(l−1,maxl≤j≤rprej),只要求出后面的和即可,使用线段树,对于每个结点求出
m
a
x
n
maxn
maxn和
f
f
f,maxn表示该区间内
p
r
e
pre
pre的最大值,
f
f
f表示将该结点中的数取前缀
m
a
x
max
max后,右结点的和,每次修改后考虑维护这两个值,
m
a
x
n
maxn
maxn随便维护,对于
f
f
f,只要实现一个函数
c
a
l
c
(
p
,
x
)
calc(p,x)
calc(p,x)表示线段树结点
p
p
p的前缀
m
a
x
max
max数组再与
x
x
x取
m
a
x
max
max后的和,就可以轻松维护了,
c
a
l
c
(
p
,
x
)
=
c
a
l
c
(
l
s
(
p
)
,
x
)
+
c
a
l
c
(
r
s
(
p
)
,
max
(
x
,
m
a
x
n
[
l
s
(
p
)
]
)
)
calc(p,x)=calc(ls(p),x)+calc(rs(p),\max(x,maxn[ls(p)]))
calc(p,x)=calc(ls(p),x)+calc(rs(p),max(x,maxn[ls(p)])),如果直接用这个式子来求的话就要跑满整棵树了,显然不行,考虑分类讨论优化复杂度,如果
x
>
m
a
x
n
[
l
s
(
p
)
]
,
c
a
l
c
(
l
s
(
p
)
,
x
)
x>maxn[ls(p)],calc(ls(p),x)
x>maxn[ls(p)],calc(ls(p),x)显然就可以直接算了,如果
x
≤
m
a
x
n
[
l
s
(
p
)
]
x\le maxn[ls(p)]
x≤maxn[ls(p)],
c
a
l
c
(
r
s
(
p
)
,
max
(
x
,
m
a
x
n
[
l
s
(
p
)
]
)
=
c
a
l
c
(
r
s
(
p
)
,
m
a
x
n
[
l
s
(
p
)
]
)
=
f
[
r
s
(
p
)
]
calc(rs(p),\max(x,maxn[ls(p)])=calc(rs(p),maxn[ls(p)])=f[rs(p)]
calc(rs(p),max(x,maxn[ls(p)])=calc(rs(p),maxn[ls(p)])=f[rs(p)],也可以直接算,一次
c
a
l
c
calc
calc的复杂度就是
O
(
log
n
)
O(\log n)
O(logn)的,一次修改的复杂度就是
O
(
log
2
n
)
O(\log^2n)
O(log2n)的,查询就很简单了,至于持久化,小事
2022.2.12省选模拟
t1 直接生成函数推一推,得到答案就是
[
x
k
]
1
(
1
−
x
)
n
∏
i
=
1
n
(
1
−
x
i
)
[x^k]\frac{1}{(1-x)^n}\prod_{i=1}^n(1-x^i)
[xk](1−x)n1∏i=1n(1−xi),前面的部分有组合意义,主要问题就是求出
∏
i
=
1
n
(
1
−
x
i
)
\prod_{i=1}^n(1-x^i)
∏i=1n(1−xi)的
0
0
0到
k
k
k的系数,只会
n
2
n^2
n2
d
p
dp
dp,考虑将
d
p
dp
dp数组打表,直接打表代码太长,观察
d
p
dp
dp数组,发现
n
n
n越大时,连续段越少,将
d
p
dp
dp数组压起来后再打表就可以了,赛时拿了
80
p
t
s
80pts
80pts,实际可以打到
90
p
t
s
90pts
90pts
正解:可以理解为要在
{
1
,
⋯
,
n
}
\{1,\cdots,n\}
{1,⋯,n}的集合中挑一些数出来,使之和为
k
k
k,正常
d
p
dp
dp相当于背包,发现最多取
O
(
n
)
O(\sqrt n)
O(n)级别个数,考虑另一种选择数的方法,假设现在有一个递减的序列,考虑两种操作:
1.
1.
1.将序列中每个数
+
1
+1
+1
2.
2.
2.将序列中每个数
+
1
+1
+1并且在末尾加上一个
1
1
1
有这两个操作一定能选出所有符合条件的集合
所以设
f
i
,
j
f_{i,j}
fi,j表示用了
i
i
i次
2
2
2操作,序列数和为
j
j
j的答案,可以得到
f
i
,
j
=
−
f
i
−
1
,
j
−
i
+
f
i
,
j
−
i
+
f
i
−
1
,
j
−
n
−
1
f_{i,j}=-f_{i-1,j-i}+f_{i,j-i}+f_{i-1,j-n-1}
fi,j=−fi−1,j−i+fi,j−i+fi−1,j−n−1,由于可能在操作过程中序列中出现
n
+
1
n+1
n+1,所以要减掉,时间复杂度为
O
(
n
n
)
O(n\sqrt n)
O(nn)
t2 直接输出
−
1
-1
−1
正解:先不考虑自环,设
f
u
f_{u}
fu为点
u
u
u到达终点的期望步数,
f
u
=
min
(
p
v
+
f
v
)
k
!
f_{u}=\frac{\min(p_v+f_v)}{k!}
fu=k!min(pv+fv),
p
p
p为边分配的排列,
k
k
k为总边数,可以提前将到达的点按
f
f
f排序,边按边权排序,考虑求出
P
(
x
)
P(x)
P(x)表示最小边权大于等于
x
x
x的概率,具体就是求出
g
i
g_i
gi表示,这个点权能与多少条边匹配,
P
(
x
)
=
1
k
!
∏
(
g
i
−
i
+
1
)
P(x)=\frac{1}{k!}\prod(g_i-i+1)
P(x)=k!1∏(gi−i+1),然后就可以
O
(
k
3
)
O(k^3)
O(k3)得到答案,可以提前把每种配对情况提出来排序,就可以做到
O
(
k
2
log
n
)
O(k^2\log n)
O(k2logn),对于自环的情况,可以二分
f
u
f_{u}
fu,用上述方法求期望,看是大了还是小了,就可以做到
O
(
k
2
log
2
k
)
O(k^2\log^2 k)
O(k2log2k),需要卡卡常才能过,听说可以
O
(
k
2
log
k
)
O(k^2\log k)
O(k2logk),但我不会
t3 感觉像是费用流,但是不会,搜索+特判一些特殊情况,拿到了
30
p
t
s
30pts
30pts
正解:反人类的费用流模型,停讲题的时候讲线性规划讲了一大堆,没听懂,只会感性理解,正常这种题的想法应该是新建
n
−
k
+
1
n-k+1
n−k+1个点,表示每个区间,但这题不是,先假设所有时间都在吃东西,然后再考虑将其中一些时刻换成睡觉
首先建立源点
s
s
s和源点
t
t
t
1.
1.
1.
s
s
s向
1
1
1到
k
k
k连一条流量为
1
1
1,费用为
0
0
0的边
2.
2.
2.
i
i
i向
i
+
k
i+k
i+k连一条流量为
1
1
1,费用为
S
i
−
E
i
S_i-E_i
Si−Ei的边,当
i
+
k
>
n
i+k>n
i+k>n时就向
t
t
t连边
3.
3.
3.
i
i
i向
i
+
1
i+1
i+1连一条流量为
k
−
m
i
n
s
l
e
e
p
−
m
i
n
e
a
t
k-minsleep-mineat
k−minsleep−mineat,费用为
0
0
0的边,当
i
+
1
>
n
i+1>n
i+1>n时就向
t
t
t连边
对于
2
2
2,每流其中的一条边,将相当于
i
i
i时刻在睡觉
对于
3
3
3,它的意思是每个区间最多少流
k
−
m
i
n
s
l
e
e
p
−
m
i
n
e
a
t
k-minsleep-mineat
k−minsleep−mineat这么多流量,最大流量减它就是最小流量
对于
1
1
1,就相当于一个特判,可以从
1
1
1到
k
k
k的任何一个点开始流
然后跑一个流为
k
−
m
i
n
e
a
t
k-mineat
k−mineat的最大费用流,加上吃东西的贡献之和就是答案
2022.2.15国家集训队互测
t1 哲学题,不会
t2 哲学题,不会
t3 考场时想了一个
O
(
q
n
log
v
)
O(qn\log v)
O(qnlogv)的暴力,贵在卡不满,以为能水很多分,结果发现特判链长小于
m
m
m的时候,忘记把
l
a
s
t
a
n
s
lastans
lastans赋成
0
0
0了,事实可以拿
45
p
t
s
45pts
45pts,如果空间开得够的话可以水更多分
正解:对于一组询问我们只用考虑链上前
(
m
−
1
)
log
V
(m-1)\log V
(m−1)logV大的数,证明:考虑暴力的过程,每次再
t
r
i
e
trie
trie树上看往左儿子走,还是右儿子走,如果往右儿子走,显然就不用管,如果往左儿子走,说明右儿子的结点数一定是小于等于
m
−
1
m-1
m−1个的,最多走
log
V
\log V
logV次左儿子,右儿子最多遗留
(
m
−
1
)
log
V
(m-1)\log V
(m−1)logV个备选结点,然后就用主席树直接把前
(
m
−
1
)
log
V
(m-1)\log V
(m−1)logV个结点找出来,然后再用暴力求
2022.2.18省选模拟
t1 又遇神仙
d
p
dp
dp,考试时想了一个四进制
d
p
dp
dp,能拿
70
p
t
s
70pts
70pts,但没有特判
0
0
0,实际只拿了
30
p
t
s
30pts
30pts
t2
t3 只打了最低档暴力,连
l
u
c
a
s
lucas
lucas定理都忘了
正解:
∑
i
=
0
⌊
n
k
⌋
(
n
i
k
)
F
i
k
\sum_{i=0}^{\lfloor\frac{n}{k}\rfloor}\binom{n}{ik}F_{ik}
i=0∑⌊kn⌋(ikn)Fik
斐波那契数列可以写成矩阵的形式,
F
i
=
A
i
[
0
]
[
0
]
F_i=A^i[0][0]
Fi=Ai[0][0],
A
A
A为转移矩阵,所以
=
∑
i
=
0
⌊
n
k
⌋
(
n
i
k
)
A
i
k
=\sum_{i=0}^{\lfloor\frac{n}{k}\rfloor}\binom{n}{ik}A^{ik}
=i=0∑⌊kn⌋(ikn)Aik
=
∑
i
=
0
n
[
k
∣
i
]
(
n
i
)
A
i
=\sum_{i=0}^n[k|i]\binom{n}{i}A^{i}
=i=0∑n[k∣i](in)Ai
当
k
=
1
k=1
k=1时,
∑
i
=
0
n
[
k
∣
i
]
(
n
i
)
A
i
=
∑
i
=
0
n
(
n
i
)
A
i
=
(
A
+
I
)
n
\sum_{i=0}^n[k|i]\binom{n}{i}A^{i}=\sum_{i=0}^n\binom{n}{i}A^{i}=(A+I)^n
∑i=0n[k∣i](in)Ai=∑i=0n(in)Ai=(A+I)n
考虑构造一个式子,使之等于
[
k
∣
i
]
[k|i]
[k∣i],注意到题目还给了一个条件
k
∣
p
−
1
k|p-1
k∣p−1,所以用原根构造,求出原根
g
g
g,设
w
=
g
p
−
1
k
w=g^{\frac{p-1}{k}}
w=gkp−1,即构造一个
w
w
w使得
w
k
=
1
w^k=1
wk=1
1
k
∑
j
=
0
k
−
1
w
i
j
=
[
k
∣
i
]
\frac{1}{k}\sum_{j=0}^{k-1}w^{ij}=[k|i]
k1j=0∑k−1wij=[k∣i]
证明:当
k
∣
i
k|i
k∣i时,
1
k
∑
j
=
0
k
−
1
w
i
j
=
1
k
k
=
1
\frac{1}{k}\sum_{j=0}^{k-1}w^{ij}=\frac{1}{k}k=1
k1∑j=0k−1wij=k1k=1,当
k
∤
i
k\nmid i
k∤i时,
1
k
∑
j
=
0
k
−
1
w
i
j
=
1
−
w
k
k
(
1
−
w
i
)
=
0
\frac{1}{k}\sum_{j=0}^{k-1}w^{ij}=\frac{1-w^k}{k(1-w^i)}=0
k1∑j=0k−1wij=k(1−wi)1−wk=0
所以原式就等于
=
1
k
∑
i
=
0
n
(
n
i
)
A
i
∑
j
=
0
k
−
1
w
i
j
=\frac{1}{k}\sum_{i=0}^n\binom{n}{i}A^{i}\sum_{j=0}^{k-1}w^{ij}
=k1i=0∑n(in)Aij=0∑k−1wij
=
1
k
∑
j
=
0
k
−
1
w
j
∑
i
=
0
n
(
n
i
)
A
i
w
i
=\frac{1}{k}\sum_{j=0}^{k-1}w^j\sum_{i=0}^n\binom{n}{i}A^{i}w^i
=k1j=0∑k−1wji=0∑n(in)Aiwi
=
1
k
∑
j
=
0
k
−
1
w
j
∑
i
=
0
n
(
n
i
)
A
i
w
i
=\frac{1}{k}\sum_{j=0}^{k-1}w^j\sum_{i=0}^n\binom{n}{i}A^{i}w^i
=k1j=0∑k−1wji=0∑n(in)Aiwi
=
1
k
∑
j
=
0
k
−
1
w
j
(
A
w
+
I
)
n
=\frac{1}{k}\sum_{j=0}^{k-1}w^j(Aw+I)^n
=k1j=0∑k−1wj(Aw+I)n
然后就可以直接算了,时间复杂度
O
(
k
log
k
)
O(k\log k)
O(klogk)
2022.2.19 省选模拟
t1 矩阵树定理,不会,感觉矩阵树定理好难,行列式啥的都不太会
正解:无向图生成树计数,设
A
A
A为邻接矩阵,
I
I
I为度数矩阵,
D
=
A
−
I
D=A-I
D=A−I,
D
′
D'
D′为
D
D
D删除第
i
i
i行第
i
i
i列(
i
i
i任意), 则该图的生成树个数为
d
e
t
(
D
′
)
det(D')
det(D′)
有向图生成树计数,外向树,
I
I
I改为入度矩阵,
i
i
i为根,内向树,
I
I
I改为出度矩阵,
i
i
i为根
回到本题,一个比较显然的想法就是算出每条边可能的生成树个数然后乘上边权,但是这样做是
O
(
n
5
)
O(n^5)
O(n5),可以优化到
O
(
n
3
)
O(n^3)
O(n3),这里有另一种做法,把边改成
w
x
+
1
wx+1
wx+1,最后边权和就是行列式的
x
x
x的一次项系数,单位元为
(
0
,
1
)
(0,1)
(0,1),零元为
(
0
,
0
)
(0,0)
(0,0)
t2 考场时写一合并水法,拿了
50
p
t
s
50pts
50pts
正解:不难发现,答案满足可二分性,判断合法可以设
f
(
u
,
a
,
b
)
f(u,a,b)
f(u,a,b)表示
u
u
u点能否在合法的情况下得到两条向上的路径,长度为
a
a
a和
b
b
b,复杂度会爆炸,考虑优化,显然对于一个
a
a
a我们只需要保留合法的最小的
b
b
b,
b
b
b也只需要保留合法的最小的
a
a
a,最后状态只需要保留去重之后合法的
a
a
a和
b
b
b,考虑合并两个儿子的信息,有
4
4
4种合并信息的方式,我们枚举元素数量较少的那个儿子的元素,然后在较大儿子找到一个最优的,最后的元素数量是
O
(
min
(
x
,
y
)
)
O(\min(x,y))
O(min(x,y))级别的,所以状态总数是
O
(
n
log
n
)
O(n\log n)
O(nlogn)的,精细实现可以做到
O
(
n
log
n
log
v
)
O(n\log n\log v)
O(nlognlogv)
t3 想到一个接近正解的东西,以为能过,但是复杂度伪了,需要继续优化
正解:把问题看做有很多个格点,它们最后要到达终点并且路径不交,有一个贪心的策略,每次从后面开始枚举格点,能往右走就往右走,不然就往下走,直到走到终点,考虑维护折线,每次新加一个格点,会让原来的折线坐标向左下分别移一格,可以打外围标记实现,而且会增加一个折点,二分到哪里可以到达终点,更新答案即可,由于终点的横坐标递减,所以可以直接用单调队列,时间复杂度
O
(
n
)
O(n)
O(n)
2022.2.21省选模拟
t1 神仙计数,只写了个三角形就跑路
正解:
b
u
r
n
s
i
d
e
burnside
burnside引理,对于一个置换
f
f
f,若一个染色方案
s
s
s满足
s
∗
f
=
s
s*f=s
s∗f=s,则染色方案
s
s
s是置换
f
f
f的一个不动点,设一个置换集合
G
=
{
c
n
}
,
∀
i
,
j
,
c
i
∗
c
j
∈
G
G=\{c_n\},\forall i,j,c_i*c_j\in G
G={cn},∀i,j,ci∗cj∈G,若染色方案
s
1
s_1
s1和一个染色方案
s
2
s_2
s2满足
∃
i
,
s
1
∗
c
i
=
s
2
\exist i,s_1*c_i=s_2
∃i,s1∗ci=s2,则称
s
1
s_1
s1与
s
2
s_2
s2是两种本质不同的染色方案,则所有本质不同的方案数位
1
n
∑
i
=
1
n
c
i
(
A
)
\frac{1}{n}\sum_{i=1}^nc_i(A)
n1∑i=1nci(A),设
A
A
A表示目标染色集合,
c
i
(
A
)
c_i(A)
ci(A)表示
A
A
A对于置换
c
i
c_i
ci的不动点个数
回到这题,先不考虑能否变成凸多边形,只考虑
∑
i
=
1
m
d
i
=
n
\sum_{i=1}^md_i=n
∑i=1mdi=n的条件,一共有
2
m
2m
2m种置换,其中一类是转,还有一类是翻转,容易证明封闭性,转的情况容易考虑
∑
d
∣
m
[
m
d
∣
n
]
φ
(
m
d
)
(
d
n
m
−
1
d
−
1
)
\sum_{d|m}[\frac{m}{d}|n]\varphi(\frac{m}{d})\binom{\frac{dn}{m}-1}{d-1}
∑d∣m[dm∣n]φ(dm)(d−1mdn−1),后面那个组合数就是个插板法,然后考虑翻转,如果
m
m
m为偶数,那么会有
m
2
\frac{m}{2}
2m种情况出现
2
2
2个单环,
m
−
2
2
\frac{m-2}{2}
2m−2个双环,两个单环用两个变量
i
,
j
i,j
i,j枚举,剩下的插板解决,然后在优化两层式子,就可以得到一个
O
(
1
)
O(1)
O(1)计算的式子,有
m
2
\frac{m}{2}
2m中情况有
m
2
\frac{m}{2}
2m个双环,直接插板,如果
m
m
m为奇数,会有
m
m
m种情况,会有
1
1
1个单环,
m
−
1
2
\frac{m-1}{2}
2m−1个单环,和刚才一样处理即可
考虑凸多边形的条件,就是最大的边要大于
n
2
\frac{n}{2}
2n,把最大边看作在第一个位置,只有两种置换,一种是翻转,必须让最大值在单环中,一种是不变(不要忘了,一开始我就忘记了),推推式子就可以了
对于这种题有个比较好的调试方式,先把所有部分都有暴力实现,然后在逐渐优化,一步一步的看暴力式子与优化后的式子的值是否相同
t2 脑抽,想了一个
t
a
r
j
a
n
tarjan
tarjan求割点的方法去求第一问,结果存边的空间过大,会空超,还特判了没有障碍的情况,还判错了,子任务捆绑+依赖,直接只剩
3
3
3分
正解:事实上第一问并不需要求割点,有更简单的方法,考虑求出一个
x
x
x路径,如果能往下走就往下走,能往右走就往右走,最后能够到达终点的路径,还有一个
y
y
y路径,如果能往走就往下走,能往右走就往右走,最后能够到达终点的路径,这两条路径的交点数量就是第一问的答案,考虑第二问,一个障碍放在交点的答案显然可以直接求,其他的可能方案显然就是一个在
x
x
x路径上,一个在
y
y
y路径上,枚举
x
x
x路径上的点,求出一个障碍放在这后的新的
x
x
x路径和
y
y
y路径的交点数量,由于路径长度为线性,所以时间复杂度是
O
(
n
2
)
O(n^2)
O(n2)的
t3 想了一个带权平均分配,效果还不错,无数点中只有两个点错了,子任务捆绑+依赖,直接只剩
45
45
45分
正解:考虑一个
n
b
nb
nb算法,灌水法,每次新给一个点的边的信息时,设
X
i
X_i
Xi表示左边的第
i
i
i个点已经用的份数,考虑找到一个份数
k
k
k,使得把所有与新点相连的点
X
i
X_i
Xi都加到至少为
k
k
k,并且所加的总份数恰好等于
1
1
1,如果不能等于
1
1
1就加满,可以用二分实现,题解证明了这种方法的竞争比为
1
−
1
e
≈
0.632
1-\frac{1}{e}\approx0.632
1−e1≈0.632
2022.2.22省选模拟
t1 一开始看错题,写了个假做法,后面看对题,发现不会做,暴力都不太会写,只交了假做法,竟然有
20
p
t
s
20pts
20pts
正解:不难发现一块三明治一定要两个一起吃才有用,考虑吃掉一个三明治需要怎样,例如一个
Z
\text{Z}
Z,先考虑吃掉左边的和上面的,显然吃掉它,要把在它左边的都吃掉,然后左边和它自己都只有剩下一种情况需要枚举,暴搜即可,时间复杂度
O
(
n
3
)
O(n^3)
O(n3),考虑这个过程,从左到右,暴力需要暴搜它和它左边的,事实上它左边的已经暴搜过了,所以吃掉它需要吃掉的三明治是包括吃掉左边的需要吃掉的三明治的,只需要在之前的基础上在暴搜即可,右边也要做一遍,时间复杂度
O
(
n
3
)
O(n^3)
O(n3)
t2 感觉是
p
r
u
f
e
r
prufer
prufer序列,但已经完全忘记它是啥了,暴零
正解:
p
r
u
f
e
r
prufer
prufer序列是一个长度为
n
−
2
n-2
n−2的唯一表示一棵无根树的序列,其中出现
k
k
k次的点的度数为
k
+
1
k+1
k+1
1.
1.
1.
n
n
n个点的无根树个数为
n
n
−
2
n^{n-2}
nn−2,序列上
n
−
2
n-2
n−2个位置可为任意一个点
2.
2.
2.
n
n
n个点的有根树个数为
n
n
−
1
n^{n-1}
nn−1,任取一点为根
3.
3.
3.要求第
i
i
i个点的度数为
d
i
d_i
di,无根树个数为
(
n
−
2
)
!
∏
i
=
1
n
(
d
i
−
1
)
!
\frac{(n-2)!}{\prod_{i=1}^n(d_i-1)!}
∏i=1n(di−1)!(n−2)!,度数为
d
i
d_i
di的点出现
d
i
−
1
d_i-1
di−1次,答案为
n
−
2
n-2
n−2的排列数除于
d
i
−
1
d_i-1
di−1的排列数
回到这题,显然可以用第三条公式来求解这道题目,考虑枚举每个点的度数
a
n
s
=
∑
∑
i
=
1
n
d
i
=
2
n
−
2
(
n
−
2
)
!
∏
i
=
1
n
(
d
i
−
1
)
!
∏
i
=
1
n
d
i
w
i
d
i
ans=\sum_{\sum_{i=1}^nd_i=2n-2}\frac{(n-2)!}{\prod_{i=1}^n(d_i-1)!}\prod_{i=1}^nd_iw_i^{d_i}
ans=∑i=1ndi=2n−2∑∏i=1n(di−1)!(n−2)!i=1∏ndiwidi
=
(
n
−
2
)
!
∑
∑
i
=
1
n
d
i
=
2
n
−
2
∏
i
=
1
n
d
i
w
i
d
i
(
d
i
−
1
)
!
=(n-2)!\sum_{\sum_{i=1}^nd_i=2n-2}\prod_{i=1}^n\frac{d_iw_i^{d_i}}{(d_i-1)!}
=(n−2)!∑i=1ndi=2n−2∑i=1∏n(di−1)!diwidi
=
(
n
−
2
)
!
∑
∑
i
=
1
n
d
i
=
n
−
2
∏
i
=
1
n
(
d
i
+
1
)
w
i
d
i
+
1
d
i
!
=(n-2)!\sum_{\sum_{i=1}^nd_i=n-2}\prod_{i=1}^n\frac{(d_i+1)w_i^{d_i+1}}{d_i!}
=(n−2)!∑i=1ndi=n−2∑i=1∏ndi!(di+1)widi+1
考虑使用生成函数,设
F
k
(
x
)
=
∑
i
=
0
∞
(
i
+
1
)
w
k
i
+
1
i
!
x
i
=
w
k
∑
i
=
0
∞
(
i
+
1
)
w
k
i
i
!
x
i
F_k(x)=\sum_{i=0}^\infty\frac{(i+1)w_k^{i+1}}{i!}x^i=w_k\sum_{i=0}^\infty\frac{(i+1)w_k^i}{i!}x^i
Fk(x)=∑i=0∞i!(i+1)wki+1xi=wk∑i=0∞i!(i+1)wkixi,答案就是
[
x
n
−
2
]
(
n
−
2
)
!
∑
k
=
1
n
F
k
(
x
)
[x^{n-2}](n-2)!\sum_{k=1}^nF_k(x)
[xn−2](n−2)!∑k=1nFk(x),直接
m
t
t
mtt
mtt就可以拿
50
p
t
s
50pts
50pts,考虑用
e
x
=
∑
i
=
0
∞
1
i
!
x
i
e^x=\sum_{i=0}^\infty \frac{1}{i!}x^i
ex=∑i=0∞i!1xi变形一下式子,设
G
k
(
x
)
=
∑
i
=
0
∞
i
+
1
i
!
x
i
G_k(x)=\sum_{i=0}^\infty\frac{i+1}{i!}x^i
Gk(x)=i=0∑∞i!i+1xi
=
e
x
+
∑
i
=
0
∞
i
i
!
x
i
=e^x+\sum_{i=0}^\infty\frac{i}{i!}x^i
=ex+i=0∑∞i!ixi
=
e
x
+
x
∑
i
=
0
∞
1
i
!
x
i
=e^x+x\sum_{i=0}^\infty\frac{1}{i!}x^i
=ex+xi=0∑∞i!1xi
=
e
x
(
1
+
x
)
=e^x(1+x)
=ex(1+x)
所以
F
k
(
x
)
=
w
k
G
k
(
w
k
x
)
=
w
k
e
w
k
x
(
1
+
w
k
x
)
F_k(x)=w_kG_k(w_kx)=w_ke^{w_kx}(1+w_kx)
Fk(x)=wkGk(wkx)=wkewkx(1+wkx),
a
n
s
=
[
x
n
−
2
]
(
n
−
2
)
!
∏
k
=
1
n
w
k
e
w
k
x
(
1
+
w
k
x
)
=
[
x
n
−
2
]
(
n
−
2
)
!
∏
k
=
1
n
w
k
e
w
k
x
(
1
+
w
k
x
)
=
[
x
n
−
2
]
(
n
−
2
)
!
e
∑
k
=
1
n
w
k
x
(
∏
k
=
1
n
w
k
)
(
∏
k
=
1
n
(
1
+
w
k
x
)
)
ans=[x^{n-2}](n-2)!\prod_{k=1}^nw_ke^{w_kx}(1+w_kx)=[x^{n-2}](n-2)!\prod_{k=1}^nw_ke^{w_kx}(1+w_kx)=[x^{n-2}](n-2)!e^{\sum_{k=1}^nw_kx}(\prod_{k=1}^nw_k)(\prod_{k=1}^n(1+w_kx))
ans=[xn−2](n−2)!∏k=1nwkewkx(1+wkx)=[xn−2](n−2)!∏k=1nwkewkx(1+wkx)=[xn−2](n−2)!e∑k=1nwkx(∏k=1nwk)(∏k=1n(1+wkx)),后面可以
d
p
dp
dp,前面可以
O
(
1
)
O(1)
O(1),时间复杂度为
O
(
n
2
)
O(n^2)
O(n2),用分治
m
t
t
mtt
mtt也可以做到
O
(
n
log
2
n
)
O(n\log^2 n)
O(nlog2n),但没什么必要
t3 写了个暴力就跑了,也没多想
正解:考虑怎么做
s
i
=
1
,
t
i
=
n
s_i=1,t_i=n
si=1,ti=n的,发现它的过程就是去掉一个最大值,然后加入一个数,可以用一个堆维护,知道这个以后,考虑分块解决,如果经过一个整块直接进行上面的过程,并且在该块留下一个标记,散块就重构之后暴力解决,问题是重构时如何处理标记对整个块的影响,考虑一个一个加入块中的元素,每次我们会按顺序对标记进行这样的操作遇到一个小于自己的标记就交换,最后经历所有的标记之后,就是该元素重构后的值,发现这个过程和标记对块的过程是基本一样的,所以再用一个堆就可以解决,时间复杂度
O
(
q
n
log
n
)
O(q\sqrt n\log n)
O(qnlogn)
2022.2.24省选模拟
t1
d
d
p
ddp
ddp板子,直接把转移写成矩阵的形式,然后套上线段树,时间复杂度
O
(
n
log
n
)
O(n\log n)
O(nlogn),但是卡空间,所以可以线段树底层分块,整块线段树,散块暴力跑,块长约为
log
n
\log n
logn级别,时间复杂度不变,空间复杂度降为
O
(
n
log
n
)
O(\frac{n}{\log n})
O(lognn)
t2 树上期望,连
20
p
t
s
20pts
20pts都没有写完
正解:考虑这样一个期望
d
p
dp
dp,假设当前状态为
S
S
S,上一个状态为
P
P
P,加上其他东西后到达的状态为
t
i
t_i
ti,则有方程
f
(
S
)
=
p
f
(
P
)
+
(
1
−
p
)
∑
i
=
1
x
f
(
t
i
)
+
1
f(S)=pf(P)+(1-p)\sum_{i=1}^xf(t_i)+1
f(S)=pf(P)+(1−p)∑i=1xf(ti)+1,直接高斯消元解决
m
≤
2
m\le 2
m≤2的情况,当
m
≤
50
m\le 50
m≤50时,总共状态数约有
1
0
6
10^6
106个,高斯消元无法通过,不难发现每个状态只有唯一一个前驱状态,所以可以用一些树上消元的技巧来解决
设
f
(
S
)
=
k
f
(
p
)
+
b
f(S)=kf(p)+b
f(S)=kf(p)+b,则有
f
(
S
)
=
p
f
(
P
)
+
(
1
−
p
)
∑
i
=
1
x
(
k
t
i
f
(
S
)
+
b
t
i
)
+
1
f(S)=pf(P)+(1-p)\sum_{i=1}^x(k_{t_i}f(S)+b_{t_i})+1
f(S)=pf(P)+(1−p)i=1∑x(ktif(S)+bti)+1
f
(
S
)
=
p
f
(
P
)
+
(
1
−
p
)
∑
i
=
1
x
b
t
i
+
1
1
−
∑
i
=
1
x
k
t
i
f(S)=\frac{pf(P)+(1-p)\sum_{i=1}^xb_{t_i}+1}{1-\sum_{i=1}^xk_{t_i}}
f(S)=1−∑i=1xktipf(P)+(1−p)∑i=1xbti+1
所以我们就可以通过儿子的
k
k
k和
b
b
b来得到当前结点的
k
k
k和
b
b
b,然后就可以递推了,不难发现当当前点的最后一个点的位置
h
h
h和原本
a
a
a的和相同时,
k
k
k和
b
b
b的值恒定,然后就可以记忆化了,时间复杂度为
O
(
n
m
2
)
O(nm^2)
O(nm2)
t3 昨天刚看了
3
b
1
b
3b1b
3b1b的视频,知道我们可以找到一组
i
^
\hat{i}
i^和一组
j
^
\hat{j}
j^就可以用它们来表示原来的坐标系,在这题中使
i
^
\hat{i}
i^和
j
^
\hat{j}
j^垂直且相等并且对于其他所有点都有整数表示就行了,在
0
∼
1000
0\sim 1000
0∼1000中暴力枚举
i
^
\hat{i}
i^,然后暴力判就能拿
56
p
t
s
56pts
56pts,但是快读负数判错了暴
0
0
0,因为这个原因,后来调正解也调了好久
正解:初中学长
L
H
F
LHF
LHF在场上推出高斯整数
G
C
D
GCD
GCD,实在是太强了,不过他的做法要转来转去,有很多特判,比较麻烦,有更一般的做法,我们考虑一个高斯整数的
g
c
d
gcd
gcd怎么求,可以类比一般整数的
g
c
d
gcd
gcd,
c
g
c
d
(
a
,
b
)
=
c
g
c
d
(
b
,
a
%
b
)
cgcd(a,b)=cgcd(b,a\%b)
cgcd(a,b)=cgcd(b,a%b),但是高斯整数并没有
%
\%
%的定义,考虑
a
%
b
=
a
−
⌊
a
b
⌋
b
a\%b=a-\lfloor\frac{a}{b}\rfloor b
a%b=a−⌊ba⌋b,定义
⌊
a
b
⌋
=
[
c
]
+
[
d
]
i
\lfloor\frac{a}{b}\rfloor=[c]+[d]i
⌊ba⌋=[c]+[d]i,就是把实部和虚部分别四舍五入,这样就可以进行高斯整数
g
c
d
gcd
gcd了,时间复杂度为
O
(
n
log
v
)
O(n\log v)
O(nlogv)
2022.2.25省选模拟
t1 一开始以为可以直接启发式合并,但是发现一条边加入不同连通块的标记并不互相独立,所以要全部跑一遍,直接暴力并竟然有
68
p
t
s
68pts
68pts
正解:有一个非常
n
b
nb
nb的想法可以解决不独立的问题,
l
i
+
r
i
≥
s
i
l_i+r_i\ge s_i
li+ri≥si,首先要满足
l
i
≥
⌈
s
i
2
⌉
l_i\ge \lceil\frac{s_i}{2}\rceil
li≥⌈2si⌉或
r
i
≥
⌈
s
i
2
⌉
r_i\ge \lceil\frac{s_i}{2}\rceil
ri≥⌈2si⌉,然后我们把原来的限制变成它,一条边的两边就相互独立了,当有一边
≥
⌈
s
i
2
⌉
\ge \lceil\frac{s_i}{2}\rceil
≥⌈2si⌉,先判断是否
l
i
+
r
i
≥
s
i
l_i+r_i\ge s_i
li+ri≥si,否则就继续这样划分,每次至少除
2
2
2,每条边最多进行这样的操作
log
n
\log n
logn次,然后用堆+启发式合并即可,时间复杂度
O
(
n
log
3
n
)
O(n\log^3 n)
O(nlog3n),可以精细实现做到
O
(
n
log
2
n
)
O(n\log^2 n)
O(nlog2n)
t2 特判了一些情况,竟然有
40
p
t
s
40pts
40pts
正解:事实上特判的那些情况已经与正解比较相近了,首先设
N
N
N表示与前面和后面都不能右边的地方,
L
L
L表示只与右边有边的,
R
R
R表示只与左边有边的,
A
A
A表示与两边都有边的,首先有一种比较显然的构造方法,
N
N
N独自配对,
L
L
L与右边最近的
R
R
R配对,然后相邻
4
4
4个
A
A
A可以分到一组独自配对,这种构造方法需要满足
A
A
A的数量是
4
4
4的倍数,如果不是
4
4
4的倍数就不行吗?经过手玩发现
A
A
A的个数
%
4
=
1
\%4=1
%4=1或
3
3
3是,都不行,
=
2
=2
=2时可能可以,考虑用一种方式拿掉两个
A
A
A,不难发现当出现
⋯
A
L
R
A
⋯
A
L
R
\cdots ALR A\cdots ALR
⋯ALRA⋯ALR时,我们可以让最前面的
A
A
A与中间的
A
A
A配对,左边的
L
L
L与右边的
L
L
L配对,左边的
R
R
R与右边的
R
R
R配对,这样就可以去掉两个
A
A
A,然后就可以用
%
4
=
0
\%4=0
%4=0的方法处理了,
L
R
A
⋯
A
L
R
⋯
A
LR A\cdots ALR\cdots A
LRA⋯ALR⋯A时同理,如果找不到这两种情况,就无解
t3 只写了个
20
p
t
s
20pts
20pts就跑路了
正解:
m
q
z
mqz
mqz和
l
t
y
lty
lty看错题,写了一波环的
d
p
dp
dp在比赛时就
A
A
A了这道题,后来题解也证明去掉大于之前的限制后的答案是一样的,不过我并不会,考虑最优策略,设
a
b
\frac{a}{b}
ba为当前剩余的钱,当
a
b
≤
1
2
\frac{a}{b}\le\frac{1}{2}
ba≤21时,全赌,当
a
b
≥
1
2
\frac{a}{b}\ge\frac{1}{2}
ba≥21时,赌
1
−
a
b
1-\frac{a}{b}
1−ba,写成方程就是
f
(
a
b
)
=
{
p
f
(
2
a
b
)
(
i
=
0
)
p
+
(
1
−
p
)
f
(
2
a
−
b
b
)
(
i
>
0
)
f(\frac{a}{b})=\begin{cases}pf(\frac{2a}{b})\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (i=0)\\p+(1-p)f(\frac{2a-b}{b})(i>0)\ \end{cases}
f(ba)={pf(b2a) (i=0)p+(1−p)f(b2a−b)(i>0)
不难发现
a
a
a相当于在模
b
b
b意义下乘
2
2
2,由于
b
≤
1
0
6
b\le10^6
b≤106,所以循环节长度一定小于等于
1
0
6
10^6
106,直接找出循环节后消元即可
2022.2.28省选模拟
t1 不会,还要写高精度,毒瘤
t2 完全不会,想维护改变后的重链,但是完全没有想法,不知道从何下手
正解:
c
x
cx
cx写了个暴力维护重链的
O
(
n
2
log
n
)
O(n^2\log n)
O(n2logn)但是跑不满的算法过了
…
…
……
……
提前求出整棵树的
d
f
n
dfn
dfn序列,不难发现深度最浅的重心的子树大小一定是严格大于
s
u
m
2
\frac{sum}{2}
2sum的,这代表着重心在
d
f
n
dfn
dfn序列上所代表的区间的和是严格大于
s
u
m
2
\frac{sum}{2}
2sum,那我们求出
d
f
n
dfn
dfn序列上的带权中心,一个区间的和要大于
s
u
m
2
\frac{sum}{2}
2sum,就必须要跨过带权中心,也就是说带权重心是带权中心的一个祖先,那么用树剖跳着找就行了,用线段树维护和,时间复杂度为
O
(
n
log
2
n
)
O(n\log^2 n)
O(nlog2n)
t3 也不太会,只能写个状压就跑路
正解:
y
y
t
yyt
yyt讲了一个做法,将前
26
26
26个分为一组,后
8
8
8个分为一组,内部相连的算一算,跨组相连的算一算,挺复杂,而且不太能过
题解的做法比较清新,首先把
2
i
2i
2i和
2
i
+
1
2i+1
2i+1分为一组,一个一组的单独考虑,考虑成链和成环的情况,分别用状压
d
p
dp
dp计算,成环的
d
p
dp
dp由于环的顺序并不影响,所以可以把最小的那个作为开头,就不需要在
d
p
dp
dp中同时记录开头和结尾了,最后统计答案需要用子集卷积,直接暴力枚举就可以做到
O
(
3
n
2
)
O(3^{\frac{n}{2}})
O(32n),用
F
M
T
FMT
FMT可以做到
O
(
2
n
2
n
2
4
)
O(2^{\frac{n}{2}}\frac{n^2}{4})
O(22n4n2),暴力已经可以过了,总时间复杂度为
O
(
2
n
2
n
2
+
3
n
2
)
O(2^\frac{n}{2}n^2+3^\frac{n}{2})
O(22nn2+32n)
2022.3.2省选模拟
t1 想到一个树上背包,完全调不出来
正解:老王
n
b
nb
nb,怒切
t
1
t1
t1,不难发现答案可以表示成把树分成几个连通块,然后每个连通块都取带权重心作为中转站,答案一定可以被这种方式取到,而且重心也可以随便取,最优那个一定是重心,考虑
d
p
dp
dp,设
f
i
,
j
f_{i,j}
fi,j表示第
i
i
i个点所在连通块的钦定重心是
j
j
j,如果
k
=
j
k=j
k=j,则
f
i
,
j
=
min
{
f
i
,
k
}
f_{i,j}=\min\{f_{i,k}\}
fi,j=min{fi,k}否则
f
i
,
j
=
min
{
f
i
,
k
}
+
c
f_{i,j}=\min\{f_{i,k}\}+c
fi,j=min{fi,k}+c,直接枚举是
O
(
n
4
)
O(n^4)
O(n4)的,但是发现后面的转移只需要用最小的转移,时间复杂度就是
O
(
n
3
)
O(n^3)
O(n3)
t2 不会
t3 不会
2022.3.3省选模拟
t1 首先把每个数都除以
gcd
\gcd
gcd,问题就变成怎么求一个最小的集合使得集合内的数的
gcd
\gcd
gcd为
1
1
1,枚举其中一个数,求出它的质因子,对于每个质因子我们都必须找至少一个没有这个质因子的数来把它消掉,对于不同质因子可以用同一个数,我们要用最少的数把所有质因子都消掉,
v
≤
4
e
6
v\le4e6
v≤4e6,一个数最多有
7
7
7个不同质因子,考虑状压,枚举所有质因子集合,求出是否存在一个数使得不存在质因子集合中的任何一个质因子,用容斥解决,然后用一个
3
7
3^7
37的
d
p
dp
dp,将答案合并,按道理来说是过不了的,但是可以加一些剪枝,比如说一个数的倍数不需要再跑一遍
t2 枚举前面,枚举后面,
O
(
n
3
)
O(n^3)
O(n3)暴力,写完就跑路
正解:枚举最后一刀砍哪,算它前面有多少地方能砍,如果有
k
k
k处,那每刀都可以砍或不砍,对答案的贡献就是
2
k
2^k
2k,可以用哈希实现,具体就是随机给每种数一个权值
t3 感觉是网络流,完全不会
正解: 现在只会一个
O
(
n
5
)
O(n^5)
O(n5)的
d
p
dp
dp做法,卡一卡枚举界限就能拿
80
p
t
s
80pts
80pts,不难发现我们的移动方案可以用
n
n
n个数
x
i
x_i
xi表示,
x
i
x_i
xi表示第
i
i
i个点给了后面的点
x
i
x_i
xi个石子,如果为负数的话说明后面的点将石子移动了第
i
i
i个点,答案就是
∑
i
=
1
n
∣
x
i
∣
\sum_{i=1}^n|x_i|
∑i=1n∣xi∣,考虑
d
p
dp
dp,设
f
i
,
j
f_{i,j}
fi,j表示到了第
i
i
i个点,
x
i
−
1
=
j
x_{i-1}=j
xi−1=j的最小移动数,显然有转移
f
i
,
j
=
min
L
i
−
1
≤
a
i
−
1
+
k
−
j
≤
R
i
−
1
{
f
i
−
1
,
k
}
+
∣
j
∣
f_{i,j}=\min\limits_{L_{i-1}\le a_{i-1}+k-j\le R_{i-1}}\{f_{i-1,k}\}+|j|
fi,j=Li−1≤ai−1+k−j≤Ri−1min{fi−1,k}+∣j∣,流量是
n
2
n^2
n2级别的,由于有环,所以要枚举
x
n
x^n
xn,
d
p
dp
dp转移可以用单调队列优化,时间复杂度就是
O
(
n
5
)
O(n^5)
O(n5),卡流量界限,能过
n
=
100
n=100
n=100的数据
正解:把
f
f
f看成一个函数,那
f
f
f的转移就可以看成平移和加上一个绝对值函数,所以
f
f
f显然是凸的,这些转移都可以用一个小根堆和一个大根堆实现,具体可参考
s
l
o
p
e
t
r
i
c
k
slope\ trick
slope trick,时间复杂度就变成了
O
(
n
3
log
n
)
O(n^3\log n)
O(n3logn),根据题解证明但我并不会,关于第
n
n
n个点流向第一个点的流量和最优答案的函数是单峰的,所以就可以三分求解,时间复杂度就是
O
(
n
log
2
n
)
O(n\log^2 n)
O(nlog2n)
2022.3.4省选模拟
t1 想到一个
O
(
n
)
O(n)
O(n)求答案的方法,然后暴力加上各种剪枝,结果数据水竟然拿到了
85
p
t
s
?
?
?
85pts???
85pts???
正解:答案总和一定是
O
(
n
ln
n
k
)
O(\frac{n\ln n}{k})
O(knlnn)级别的,我们希望于此设计出优秀的算法,考虑这样一个贪心,每次从最底下找到第一个点,其子树内直径大于等于
i
k
ik
ik,然后我们把这个子树暂时删去,答案
+
1
+1
+1,继续这样的操作,直至不能再删,考虑优化这个过程,对于每个
i
i
i预处理出最底层的那些点,然后向上倍增找出其他点,求直径可以用线段树
+
O
(
1
)
l
c
a
+O(1)lca
+O(1)lca来做到,删除子树直接在线段树上覆盖,撤销可以用可持久化线段树
t2 观察样例,输出都是
n
o
no
no,行列式都是
0
0
0,直接写手行列式,行列式为
0
0
0则收敛,行列式不为
0
0
0就发散,仔细想了一下好像还很有道理,如果行列式不为
0
0
0,那行列式就是发散的,结果由于时间复杂度的问题只拿了
40
p
t
s
40pts
40pts,事实上它可以跑对所有答案,但它是假的,后来经过探讨,行列式为
0
0
0应该是矩阵收敛的一个必要条件
正解:把矩阵看成邻接矩阵,如果有环就不收敛
t3 暴力 h a s h hash hash判重,再写手菊花部分分,拿了 30 p t s 30pts 30pts
2022.3.9省选模拟
t1 不知道一个环的贡献是什么,不会推,暴0
正解:事实证明,不会的东西可以多打表,考虑一个环经过操作之后会变成什么,一定一个环套树,并且环的顺序必须是刚开始钦定的顺序,考虑把环拆掉,让环上的点都向一个虚点连边,套上
p
r
u
f
e
r
prufer
prufer序列就得到了一个环的贡献是
(
n
+
1
)
n
−
1
(n+1)^{n-1}
(n+1)n−1,这样对于一个确定的
S
S
S我们就可以直接算出它能到达的序列
A
A
A的个数,设
g
(
i
)
=
(
i
+
1
)
i
−
1
g(i)=(i+1)^{i-1}
g(i)=(i+1)i−1,则有
a
n
s
n
=
∑
i
=
1
n
(
n
−
1
i
−
1
)
(
i
−
1
)
!
g
(
i
)
a
n
s
n
−
i
ans_{n}=\sum_{i=1}^n\binom{n-1}{i-1}(i-1)!g(i)ans_{n-i}
ansn=∑i=1n(i−1n−1)(i−1)!g(i)ansn−i,直接套上分治
n
t
t
ntt
ntt
t2 感觉折点个数均摊应该是
O
(
log
n
)
O(\log n)
O(logn),然后只要加速非折点的转移即可,想到一个
f
h
q
t
r
e
a
p
fhq\ treap
fhq treap保存链的做法,但是非常难写,没有考虑写它,直接写了暴力
正解:正解也是一个极其难写的东西,先把二叉树的中序遍历拍到序列上,每个点存它的深度,肯定无论怎么转,中序遍历都不会改变,只考虑深度的变化,对于一个点,我们找出序列中左边第一个深度小于它的数,右边第一个深度小于它的数,深度较大的那个是父亲,深度教小的那个是折点,假定左边那个是父亲,如果旋转的话,左子树深度不变,该点及右子树深度减去一个常数,该点父亲到该点旋到的地方深度都加
1
1
1,移动区间写
s
p
l
a
y
splay
splay或者
f
h
q
t
r
e
a
p
fhq\ treap
fhq treap就行了
t3 暴力
正解:拉反狗都不学
2022.3.10省选模拟
t1 一开始看错题,想了一个做法,看对题后,以为那个做法还能用,写了个暴力出来样例都过不去,心态大崩,在得到一个想法之后,应该先手玩样例,确认无误后再深入思考,不然会浪费很多时间
正解:把转移看成边,那么就得到了一个
D
A
G
DAG
DAG,考虑建出支配树,直接暴力找边显然不对,边数是
O
(
n
2
)
O(n^2)
O(n2)级别的,考虑怎样的两个点之间会有转移边,当且仅当
f
y
=
f
x
−
1
,
a
y
<
a
x
,
y
<
x
f_y=f_x-1,a_y<a_x,y<x
fy=fx−1,ay<ax,y<x时,有一条
y
y
y到
x
x
x的边,求支配树的过程是按拓扑序枚举每个点,把这个点所能到达的所有的点在支配树上的
l
c
a
lca
lca作为该点在支配树上的父亲,由于
l
c
a
lca
lca具有结合律,可以考虑在线段树上求出,对于每个
f
f
f值都开一棵线段树,下标是
a
a
a值,查询父亲就是查询
f
x
−
1
f_x-1
fx−1的线段树上
1
∼
a
x
−
1
1\sim a_x-1
1∼ax−1的
l
c
a
lca
lca,时间复杂度为
O
(
n
log
2
n
)
O(n\log^2 n)
O(nlog2n),听说可以
O
(
n
log
n
)
O(n\log n)
O(nlogn),但我不会
t2 想了一会,推了推式子发现是个卷积,直接卷,结果大样例过不了,事实上是因为推式子时把 m m m写成了 n n n,只能跑对 n = m n=m n=m的情况,如果有时候大样例过不了,只能过小样例,观察一下是不是因为小样例有什么特殊性质导致小样例能跑对
t3 暴力跑路
正解:神仙题,先考虑
k
=
1
k=1
k=1怎么做
有一个结论
φ
(
i
j
)
=
φ
(
i
)
φ
(
j
)
gcd
(
i
,
j
)
φ
(
gcd
(
i
,
j
)
)
\varphi(ij)=\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}
φ(ij)=φ(gcd(i,j))φ(i)φ(j)gcd(i,j),感性理解一下就好先不证明了
不妨设
n
≤
m
n\le m
n≤m
∑
i
=
1
n
∑
j
=
1
m
φ
(
i
j
)
=
∑
i
=
1
n
∑
j
=
1
m
φ
(
i
)
φ
(
j
)
gcd
(
i
,
j
)
φ
(
gcd
(
i
,
j
)
)
\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)=\sum_{i=1}^n\sum_{j=1}^m\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}
i=1∑nj=1∑mφ(ij)=i=1∑nj=1∑mφ(gcd(i,j))φ(i)φ(j)gcd(i,j)
=
∑
d
=
1
n
d
φ
(
d
)
∑
i
=
1
⌊
n
d
⌋
∑
i
=
1
⌊
m
d
⌋
φ
(
i
d
)
φ
(
j
d
)
[
gcd
(
i
,
j
)
=
1
]
=\sum_{d=1}^n\frac{d}{\varphi(d)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{i=1}^{\lfloor\frac{m}{d}\rfloor}\varphi(id)\varphi(jd)[\gcd(i,j)=1]
=d=1∑nφ(d)di=1∑⌊dn⌋i=1∑⌊dm⌋φ(id)φ(jd)[gcd(i,j)=1]
=
∑
d
=
1
n
d
φ
(
d
)
∑
i
=
1
⌊
n
d
⌋
∑
i
=
1
⌊
m
d
⌋
φ
(
i
d
)
φ
(
j
d
)
∑
x
∣
i
,
x
∣
j
μ
(
x
)
=\sum_{d=1}^n\frac{d}{\varphi(d)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{i=1}^{\lfloor\frac{m}{d}\rfloor}\varphi(id)\varphi(jd)\sum_{x|i,x|j}\mu(x)
=d=1∑nφ(d)di=1∑⌊dn⌋i=1∑⌊dm⌋φ(id)φ(jd)x∣i,x∣j∑μ(x)
=
∑
d
=
1
n
d
φ
(
d
)
∑
x
=
1
⌊
n
d
⌋
μ
(
x
)
∑
i
=
1
⌊
n
d
x
⌋
∑
i
=
1
⌊
m
d
x
⌋
φ
(
i
d
x
)
φ
(
j
d
x
)
=\sum_{d=1}^n\frac{d}{\varphi(d)}\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\mu(x)\sum_{i=1}^{\lfloor\frac{n}{dx}\rfloor}\sum_{i=1}^{\lfloor\frac{m}{dx}\rfloor}\varphi(idx)\varphi(jdx)
=d=1∑nφ(d)dx=1∑⌊dn⌋μ(x)i=1∑⌊dxn⌋i=1∑⌊dxm⌋φ(idx)φ(jdx)
=
∑
T
=
1
n
∑
d
∣
T
d
φ
(
d
)
μ
(
T
d
)
∑
i
=
1
⌊
n
T
⌋
φ
(
i
T
)
∑
i
=
1
⌊
m
T
⌋
φ
(
j
T
)
=\sum_{T=1}^n\sum_{d|T}\frac{d}{\varphi(d)}\mu(\frac{T}{d})\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\varphi(iT)\sum_{i=1}^{\lfloor\frac{m}{T}\rfloor}\varphi(jT)
=T=1∑nd∣T∑φ(d)dμ(dT)i=1∑⌊Tn⌋φ(iT)i=1∑⌊Tm⌋φ(jT)
设
f
(
x
)
=
∑
d
∣
x
d
φ
(
d
)
μ
(
x
d
)
,
g
(
x
,
y
)
=
∑
i
=
1
y
φ
(
i
x
)
f(x)=\sum_{d|x}\frac{d}{\varphi(d)}\mu(\frac{x}{d}),g(x,y)=\sum_{i=1}^y\varphi(ix)
f(x)=∑d∣xφ(d)dμ(dx),g(x,y)=∑i=1yφ(ix),则原式变为
=
∑
T
=
1
n
f
(
T
)
g
(
T
,
⌊
n
T
⌋
)
g
(
T
,
⌊
m
T
⌋
)
=\sum_{T=1}^nf(T)g(T,\lfloor\frac{n}{T}\rfloor)g(T,\lfloor\frac{m}{T}\rfloor)
=T=1∑nf(T)g(T,⌊Tn⌋)g(T,⌊Tm⌋)
f
f
f和
g
g
g我们都可以
O
(
n
log
n
)
O(n\log n)
O(nlogn)预处理,考虑设定一个阈值
B
B
B,
s
(
i
,
j
,
k
)
=
∑
w
=
1
k
f
(
k
)
g
(
k
,
i
)
g
(
k
,
j
)
s(i,j,k)=\sum_{w=1}^kf(k)g(k,i)g(k,j)
s(i,j,k)=∑w=1kf(k)g(k,i)g(k,j),我们把
i
≤
B
且
j
≤
B
i\le B且j\le B
i≤B且j≤B的
a
n
s
ans
ans都预处理出来,那我们回答询问时
n
T
≤
B
\frac{n}{T}\le B
Tn≤B的地方就可以用数论分块,
n
T
>
B
\frac{n}{T}>B
Tn>B的地方就暴力解决,预处理时间复杂度为
O
(
n
B
2
)
O(nB^2)
O(nB2),查询复杂度为
O
(
n
2
B
)
O(\frac{n^2}{B})
O(Bn2),当
B
=
n
1
3
B=n^{\frac{1}{3}}
B=n31时,总时间复杂度最优,为
O
(
n
5
3
)
O(n^{\frac{5}{3}})
O(n35)
考虑
k
≠
1
k\not =1
k=1时怎么解决,首先必须要把
φ
(
i
j
k
)
\varphi(ijk)
φ(ijk)的
i
j
ij
ij和
k
k
k分开,直接用原来的式子一个一个拆开会得到一个完全不对称的式子,没什么用,接下来会用到一些奇怪的构造方法
φ
(
i
j
k
)
=
φ
(
i
j
k
)
φ
(
k
)
k
φ
(
k
)
k
=
φ
(
i
j
k
2
)
k
\varphi(ijk)=\frac{\varphi(ijk)\varphi(k)k}{\varphi(k)k}=\frac{\varphi(ijk^2)}{k}
φ(ijk)=φ(k)kφ(ijk)φ(k)k=kφ(ijk2)
=
φ
(
i
k
)
φ
(
j
k
)
gcd
(
i
,
j
)
k
φ
(
gcd
(
i
,
j
)
k
)
k
=
φ
(
i
k
)
φ
(
j
k
)
gcd
(
i
,
j
)
φ
(
gcd
(
i
,
j
)
k
)
=\frac{\varphi(ik)\varphi(jk)\gcd(i,j)k}{\varphi(\gcd(i,j)k)k}=\frac{\varphi(ik)\varphi(jk)\gcd(i,j)}{\varphi(\gcd(i,j)k)}
=φ(gcd(i,j)k)kφ(ik)φ(jk)gcd(i,j)k=φ(gcd(i,j)k)φ(ik)φ(jk)gcd(i,j)
=
[
φ
(
i
k
)
φ
(
k
)
φ
(
j
k
)
φ
(
k
)
φ
(
k
)
φ
(
gcd
(
i
,
j
)
k
)
gcd
(
i
,
j
)
]
φ
(
k
)
=[\frac{\varphi(ik)}{\varphi(k)}\frac{\varphi(jk)}{\varphi(k)}\frac{\varphi(k)}{\varphi(\gcd(i,j)k)}\gcd(i,j)]\varphi(k)
=[φ(k)φ(ik)φ(k)φ(jk)φ(gcd(i,j)k)φ(k)gcd(i,j)]φ(k)
设
F
(
x
)
=
φ
(
x
k
)
φ
(
x
)
F(x)=\frac{\varphi(xk)}{\varphi(x)}
F(x)=φ(x)φ(xk),则有
φ
(
i
j
k
)
=
F
(
i
)
F
(
j
)
gcd
(
i
,
j
)
F
(
gcd
(
i
,
j
)
)
φ
(
k
)
\varphi(ijk)=\frac{F(i)F(j)\gcd(i,j)}{F(\gcd(i,j))}\varphi(k)
φ(ijk)=F(gcd(i,j))F(i)F(j)gcd(i,j)φ(k)
这个式子是不是和
k
=
1
k=1
k=1时那个式子很像,
F
F
F同样可以
O
(
n
log
n
)
O(n\log n)
O(nlogn)预处理,直接套用上面的做法即可
2022.3.15省选模拟
t1 想了一个
O
(
n
n
)
O(n\sqrt n)
O(nn)的做法,代码短,但调边界调了很长时间
正解:如果没有
−
1
-1
−1和
m
m
m的限制,那答案就是
[
x
n
]
(
1
+
x
+
x
2
)
n
[x^n](1+x+x^2)^n
[xn](1+x+x2)n,有限制,我们可以把所有的系数都求出来,然后用折线法容斥得出答案,考虑如何快速求
(
1
+
x
+
x
2
)
n
(1+x+x^2)^n
(1+x+x2)n的所有系数,设
H
=
1
+
x
+
x
2
,
F
=
H
n
H=1+x+x^2,F=H^n
H=1+x+x2,F=Hn
F
=
H
n
F=H^n
F=Hn
F
′
=
n
H
′
H
n
−
1
F'=nH'H^{n-1}
F′=nH′Hn−1
F
′
H
=
n
H
′
H
n
=
n
H
′
F
F'H=nH'H^n=nH'F
F′H=nH′Hn=nH′F
F
′
(
1
+
x
+
x
2
)
=
n
(
1
+
2
x
)
F
F'(1+x+x^2)=n(1+2x)F
F′(1+x+x2)=n(1+2x)F
提取第
i
i
i项系数
[
x
i
]
F
′
(
1
+
x
+
x
2
)
=
[
x
i
]
n
(
1
+
2
x
)
F
[x^i]F'(1+x+x^2)=[x^i]n(1+2x)F
[xi]F′(1+x+x2)=[xi]n(1+2x)F
[
x
i
]
F
′
+
[
x
i
−
1
]
F
′
+
[
x
i
−
2
]
F
′
=
n
[
x
i
]
F
+
2
n
[
x
i
−
1
]
F
[x^i]F'+[x^{i-1}]F'+[x^{i-2}]F'=n[x^i]F+2n[x^{i-1}]F
[xi]F′+[xi−1]F′+[xi−2]F′=n[xi]F+2n[xi−1]F
由
[
x
i
]
F
′
=
(
i
+
1
)
[
x
i
+
1
]
F
[x^i]F'=(i+1)[x^{i+1}]F
[xi]F′=(i+1)[xi+1]F
(
i
+
1
)
[
x
i
+
1
]
F
+
i
[
x
i
]
F
+
(
i
−
1
)
[
x
i
−
1
]
F
=
n
[
x
i
]
F
+
2
n
[
x
i
−
1
]
F
(i+1)[x^{i+1}]F+i[x^i]F+(i-1)[x^{i-1}]F=n[x^i]F+2n[x^{i-1}]F
(i+1)[xi+1]F+i[xi]F+(i−1)[xi−1]F=n[xi]F+2n[xi−1]F
[
x
i
+
1
]
F
=
(
n
−
i
)
[
x
i
]
F
+
(
2
n
−
i
+
1
)
[
x
i
−
1
]
F
i
+
1
[x^{i+1}]F=\frac{(n-i)[x^i]F+(2n-i+1)[x^{i-1}]F}{i+1}
[xi+1]F=i+1(n−i)[xi]F+(2n−i+1)[xi−1]F
[
x
0
]
F
[x^0]F
[x0]F和
[
x
1
]
F
[x^1]F
[x1]F可以快速求,递推即可
t2 写了个二维线段树,时间复杂度
O
(
n
2
)
O(n^2)
O(n2)
正解:
Ynoi
\text{Ynoi}
Ynoi的毒瘤题目,不会
t3 暴力
正解:感觉有点难以理解,想了很久,先对
1
∼
n
1\sim n
1∼n进行合法分段,然后左右翻转,打乱顺序,打乱顺序就是乘一个阶乘,但是打乱顺序后有一些段可能会连到一起,考虑容斥,每次钦定
k
k
k个间隔被连接,再乘上
(
−
1
)
k
(-1)^k
(−1)k,考虑
d
p
dp
dp解决,
−
1
-1
−1可以在转移中乘上,设
f
i
,
j
f_{i,j}
fi,j表示到第
i
i
i个位置,有
j
j
j个段,已经算上容斥系数的方案数,由于长度为
1
1
1的段不需要乘
2
2
2,但拼上一个长度为
1
1
1的段需要乘
2
2
2,所以要多设一个
g
g
g表示结尾段长度为
1
1
1的方案数