T1:Matrix
小z 的女朋友送给小z 一个
n
×
n
n×n
n×n的矩阵。但是矩阵实在太大了,小z 的女朋友拿不动,只能带给他两个长度为n 的整数序列l,t,分别作为矩阵F的第一行和第一列(保证
l
1
=
t
1
l1=t1
l1=t1),并且告诉小z 矩阵可以通过如下方式得到:
F
(
i
,
j
)
=
a
∗
F
(
i
,
j
−
1
)
+
b
∗
F
(
i
−
1
,
j
)
F(i,j)=a∗F(i,j−1)+b∗F(i−1,j)
F(i,j)=a∗F(i,j−1)+b∗F(i−1,j)
现在小z 猜到了系数a,b,他想要计算
F
(
n
,
n
)
F(n,n)
F(n,n)模
1
0
9
+
7
10^9+7
109+7的值。
忽然想不起从
(
0
,
0
)
(0,0)
(0,0)到
(
n
,
m
)
(n,m)
(n,m)的路径数了,数组开小……
对于一个
l
[
i
]
l[i]
l[i],通过大力推式子可以发现一定会乘上
a
n
−
1
∗
b
n
−
i
a^{n-1}*b^{n-i}
an−1∗bn−i
对于
t
[
i
]
t[i]
t[i],则一定会乘上
a
n
−
i
∗
b
n
−
1
a^{n-i}*b^{n-1}
an−i∗bn−1
然后考虑对于每一个值,会对答案造成多少贡献
可以发现,每一个值的贡献次数就是这个位置到
(
n
,
n
)
(n,n)
(n,n)的路径数
以该位置为起点,那么就是从
(
0
,
0
)
(0,0)
(0,0)到
(
n
−
1
,
n
−
i
)
(n-1,n-i)
(n−1,n−i),但是第一步是固定的
那么就成了从
(
0
,
0
)
(0,0)
(0,0)到
(
n
−
1
,
n
−
i
−
1
)
(n-1,n-i-1)
(n−1,n−i−1)
类似蚂蚁路径,方案数为
C
(
2
∗
n
−
i
−
2
,
n
−
2
)
C(2*n-i-2,n-2)
C(2∗n−i−2,n−2)即为对答案的贡献次数
T2:pq
小q 的女朋友送给小q n个整数。但是这些数太大了,小q 的女朋友拿不动,于是拜托小q把这些数减少一些。
小q 每次可以选择其中的两个x,y (不能同时选择同一个数) 变成x−P,y−Q,现在他希望能知道最多能帮女朋友减掉多少P,Q。
设
f
[
i
]
[
j
]
[
k
]
f[i][j][k]
f[i][j][k]表示处理到第
i
i
i个数,还有
j
j
j个
P
P
P,
k
k
k个
Q
Q
Q没处理,存的是已经处理的个数
可以发现,如果
P
P
P的个数为
0
0
0,那么
Q
Q
Q的个数的最大值不会超过
2000
2000
2000
如果
Q
Q
Q的个数为
0
0
0,那么
P
P
P的个数的最大值不会超过
2000
2000
2000
如果都不为零,那么
P
,
Q
P,Q
P,Q的个数都不会超过
40
40
40
根据这个性质,我们可以暴力把
s
[
i
]
s[i]
s[i]拆成
x
x
x个
P
P
P,
y
y
y个
Q
Q
Q
分类讨论
x
x
x和
j
j
j,
y
y
y和
i
i
i的大小,然后统计答案
但是数组
50
∗
2000
∗
2000
50*2000*2000
50∗2000∗2000会炸,因为每一次只会有
i
−
1
i-1
i−1对答案造成贡献,可以把i滚动掉
时间效率
O
(
n
∗
(
2000
+
2000
+
4
0
2
)
∗
50
)
O(n*(2000+2000+40^2)*50)
O(n∗(2000+2000+402)∗50)
T3:graph
小f 的女朋友送给小f 一个有n个点m条边的无向图。但是这个无向图太大了,小f 的女朋友拿不动,于是小f 希望只保留图的一部分。在这张图上,对于第i条边
u
i
,
v
i
ui,vi
ui,vi,从
u
i
ui
ui 到
v
i
vi
vi的代价为
a
i
ai
ai,从
v
i
vi
vi到
u
i
ui
ui的代价为
b
i
bi
bi。
小f 希望只保留一个包含1号点的有向环(不能有重复的点),使得环上代价之和最小。
因为环中一定有节点
1
1
1,那么就从1开始大力DFS,数组开够有
65
65
65%
那么我们可以把
1
1
1拆成
2
2
2个点,暴力枚举环上与
1
1
1相连的两点,取最小值,效率为
O
(
n
3
log
n
)
O(n^3 \log n)
O(n3logn),
25
25
25%
然后考虑优化
我们可以把与
1
1
1相连的点分成两部分,然后跑最短路,但是有可能最短的两个点在一个集合中,考虑优秀的分组方式
考虑按位分组,可以保证对于任意的
V
i
!
=
U
i
Vi!=Ui
Vi!=Ui都一定会有一次分在不同的两组,需要分成
(
l
o
g
n
)
(log n)
(logn)组,然后统计最小值即可
时间效率
O
(
n
log
n
2
)
O(n \log n^2)
O(nlogn2)