文章目录
2020杭电多校赛 Multi-University Training Contest
第一场多校 出题人 朝鲜MUTC KUT Round
1005_6755 Fibonacci Sum: 二次剩余_Fib的k次幂和
链接
传送门: here
题意
1
≤
n
,
c
≤
1
e
18
,
1
≤
k
≤
1
e
5
1\le n,c\le1e18, 1\le k\le 1e5
1≤n,c≤1e18,1≤k≤1e5
F
i
b
1
=
1
,
F
i
b
1
=
1
,
F
i
b
n
=
F
i
b
n
−
1
+
F
i
b
n
−
2
Fib1=1,Fib1=1,Fib_n=Fib_{n-1}+Fib_{n-2}
Fib1=1,Fib1=1,Fibn=Fibn−1+Fibn−2
求
F
i
b
0
k
+
F
i
b
c
k
+
F
i
b
2
c
k
+
.
.
.
+
F
i
b
n
c
k
,
m
o
d
=
1
e
9
+
9
Fib_0^k+Fib_{c}^k+Fib_{2c}^k+...+Fib_{nc}^k,\;mod=1e9+9
Fib0k+Fibck+Fib2ck+...+Fibnck,mod=1e9+9
前请提要
有关取模、同余、逆元的一些东西:
f
i
b
[
n
]
=
5
5
×
[
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
]
fib[n] = \frac{\sqrt5}{5}\times [(\frac{1+\sqrt5}{2})^n-(\frac{1-\sqrt5}{2})^n]
fib[n]=55×[(21+5)n−(21−5)n]
p
=
1
e
9
+
9
p = 1e9 + 9
p=1e9+9
二次剩余:
38300801
6
2
≡
5
(
m
o
d
p
)
383008016^2 ≡ 5 (mod\;p)
3830080162≡5(modp)
383008016
≡
5
(
m
o
d
p
)
383008016 ≡ \sqrt5 (mod\;p)
383008016≡5(modp)
1
5
≡
276601605
(
m
o
d
p
)
\frac{1}{\sqrt5}≡276601605(mod\;p)
51≡276601605(modp)
383008016
的
逆
元
=
276601605
383008016的逆元 = 276601605
383008016的逆元=276601605
(
1
+
5
)
/
2
≡
691504013
(
m
o
d
p
)
(1+\sqrt5)/2≡691504013(mod\;p)
(1+5)/2≡691504013(modp)
383008017
×
2
的
逆
元
=
691504013
383008017\times 2的逆元 = 691504013
383008017×2的逆元=691504013
(
1
−
5
)
/
2
≡
308495997
(
m
o
d
p
)
(1-\sqrt5)/2≡308495997(mod\;p)
(1−5)/2≡308495997(modp)
(
p
−
383008016
+
1
)
×
2
的
逆
元
=
308495997
(p-383008016+1)\times 2的逆元 = 308495997
(p−383008016+1)×2的逆元=308495997
f
i
b
[
n
]
=
276601605
×
[
(
691504013
)
n
−
(
308495997
)
n
]
(
m
o
d
p
)
fib[n] = 276601605\times [(691504013)^n-(308495997)^n] (mod\;\;p)
fib[n]=276601605×[(691504013)n−(308495997)n](modp)
f
i
b
fib
fib前
n
n
n项和等比数列求和:
s
u
m
=
a
a
−
1
×
(
a
n
−
1
)
(
m
o
d
p
)
=
a
2
(
a
n
−
1
)
(
m
o
d
p
)
=
a
n
+
2
−
a
2
(
m
o
d
p
)
sum = \frac{a}{a-1} \times (a^n - 1) (mod\;\;p) = a^2(a^n-1)(mod\;\;p)=a^{n+2}-a^2(mod\;\;p)
sum=a−1a×(an−1)(modp)=a2(an−1)(modp)=an+2−a2(modp)
当
p
=
1
e
9
+
9
,
a
=
691504013
或
308495997
时
成
立
p=1e9+9, a = 691504013或308495997时成立
p=1e9+9,a=691504013或308495997时成立。
思路
通过上面我们知道,在模
p
=
1
e
9
+
9
p=1e9+9
p=1e9+9意义下有:
f
i
b
[
n
]
=
276601605
×
[
(
691504013
)
n
−
(
308495997
)
n
]
(
m
o
d
p
)
=
d
×
(
a
n
−
b
n
)
fib[n] = 276601605\times [(691504013)^n-(308495997)^n] (mod\;\;p)=d\times(a^n-b^n)
fib[n]=276601605×[(691504013)n−(308495997)n](modp)=d×(an−bn)
f
i
b
n
c
=
d
×
(
a
c
n
−
b
c
n
)
=
d
×
(
A
n
−
B
n
)
=
F
i
b
C
n
,
A
=
a
c
,
B
=
b
c
fib_{nc}=d\times(a^{cn}-b^{cn})=d\times(A^n-B^n)=FibC_n,\;A=a^c,B=b^c
fibnc=d×(acn−bcn)=d×(An−Bn)=FibCn,A=ac,B=bc
(
1
d
f
i
b
n
c
)
k
(\frac1dfib_{nc})^k
(d1fibnc)k二项式展开有:
C
k
0
(
A
n
)
k
+
(
−
1
)
1
C
k
1
(
A
n
)
k
−
1
(
B
n
)
+
(
−
1
)
2
C
k
2
(
A
n
)
k
−
2
(
B
n
)
2
+
.
.
.
+
(
−
1
)
r
C
k
r
(
A
n
)
k
−
r
(
B
n
)
r
+
.
.
.
+
(
−
1
)
k
−
1
C
k
k
−
1
(
A
n
)
(
B
n
)
k
−
1
+
(
−
1
)
k
C
k
k
(
B
n
)
k
C_k^0(A^n)^k+(-1)^1C_k^1(A^n)^{k-1}(B^n)+(-1)^2C_k^2(A^n)^{k-2}(B^n)^2+...+(-1)^rC_k^r(A^n)^{k-r}(B^n)^r+...+(-1)^{k-1}C_k^{k-1}(A^n)(B^n)^{k-1}+(-1)^kC_k^k(B^n)^k
Ck0(An)k+(−1)1Ck1(An)k−1(Bn)+(−1)2Ck2(An)k−2(Bn)2+...+(−1)rCkr(An)k−r(Bn)r+...+(−1)k−1Ckk−1(An)(Bn)k−1+(−1)kCkk(Bn)k
C
k
0
(
A
k
)
n
+
(
−
1
)
1
C
k
1
(
A
k
−
1
)
n
(
B
)
n
+
(
−
1
)
2
C
k
2
(
A
k
−
2
)
n
(
B
2
)
n
+
.
.
.
+
(
−
1
)
r
C
k
r
(
A
k
−
r
)
n
(
B
r
)
n
+
.
.
.
+
(
−
1
)
k
−
1
C
k
k
−
1
(
A
)
n
(
B
k
−
1
)
n
+
(
−
1
)
k
C
k
k
(
B
k
)
n
C_k^0(A^k)^n+(-1)^1C_k^1(A^{k-1})^n(B)^n+(-1)^2C_k^2(A^{k-2})^n(B^2)^n+...+(-1)^rC_k^r(A^{k-r})^n(B^r)^n+...+(-1)^{k-1}C_k^{k-1}(A)^n(B^{k-1})^n+(-1)^kC_k^k(B^k)^n
Ck0(Ak)n+(−1)1Ck1(Ak−1)n(B)n+(−1)2Ck2(Ak−2)n(B2)n+...+(−1)rCkr(Ak−r)n(Br)n+...+(−1)k−1Ckk−1(A)n(Bk−1)n+(−1)kCkk(Bk)n
现在我们要求
F
i
b
C
FibC
FibC的前
n
n
n项和,我们
O
(
k
)
O(k)
O(k)枚举
C
k
r
C_k^r
Ckr,逐项求出前
n
n
n项和再累加即可。
对于
(
−
1
)
r
C
k
r
(-1)^rC_k^r
(−1)rCkr而言,令
a
=
A
k
−
r
B
r
a=A^{k-r}B^r
a=Ak−rBr,前
n
n
n项和为
(
−
1
)
r
C
k
r
×
a
×
(
a
n
−
1
)
a
−
1
(-1)^rC_k^r\times\frac {a\times(a^n-1)}{a-1}
(−1)rCkr×a−1a×(an−1)
可以加的几个优化:
- 欧拉降幂, n , c ≤ 1 e 18 , p = 1 e 9 + 9 n,c\le1e18,p=1e9+9 n,c≤1e18,p=1e9+9, a n ( m o d p ) = a n % ϕ ( p ) ( m o d p ) a^n(mod \;p)=a^{n\%\phi(p)}(mod\;p) an(modp)=an%ϕ(p)(modp) ^_^
- a = A k − r B r a=A^{k-r}B^r a=Ak−rBr没有必要预处理,我们可以在线求,令 a = A k a=A^k a=Ak,然后 a = a ∗ b ∗ i n v ( a ) a=a*b*inv(a) a=a∗b∗inv(a)即可
- 同理 a n a^n an也可以在线求,然后就过了。
备注
参考:ACDreamers
AC_CODE
here
1006_6756 Finding a MEX: 分块_线段树_树状数组
链接
传送门: here
题意
n
,
m
,
q
≤
1
e
5
n,m,q\le 1e5
n,m,q≤1e5无向图,
S
u
=
{
A
v
∣
(
u
,
v
)
∈
E
}
S_u=\{A_v|(u,v)\in E\}
Su={Av∣(u,v)∈E},
F
u
=
m
e
x
(
S
u
)
F_u=mex(S_u)
Fu=mex(Su)
t
y
p
e
1
:
1
u
x
,
c
h
a
n
g
e
A
u
=
x
type 1: 1\;u\;x, change\;A_u = x
type1:1ux,changeAu=x
t
y
p
e
2
:
2
u
,
q
u
e
r
y
F
u
type 2: 2\;u, query\;F_u
type2:2u,queryFu
思路
度数大于
m
\sqrt m
m的超级点不超多
m
\sqrt m
m个。
小点暴力算,超级点用分块或者bit,线段树
分块复杂度
O
(
n
∗
n
)
O(n*\sqrt n)
O(n∗n), 1170ms
线段树复杂度
O
(
n
∗
n
∗
l
o
g
(
n
)
)
O(n*\sqrt n*log(n))
O(n∗n∗log(n)), 1560MS
树状数组+二分求mex复杂度
O
(
n
∗
n
∗
l
o
g
(
n
)
∗
l
o
g
(
n
)
)
O(n*\sqrt n*log(n)*log(n))
O(n∗n∗log(n)∗log(n)), 1092MS
树状数组求mex复杂度
O
(
n
∗
n
∗
l
o
g
(
n
)
∗
l
o
g
(
n
)
)
O(n*\sqrt n*log(n)*log(n))
O(n∗n∗log(n)∗log(n)), 1762MS
动态开点线段树TLE
分块维护每个块内数字第一次出现的次数,
O
(
n
)
O(\sqrt n )
O(n)修改,
O
(
n
)
O(\sqrt n )
O(n)查询
线段树维护mex其实就是维护最小值
备注
AC_CODE
分块,线段树,树状数组求mex,树状数组+二分求mex
1009_6759 Leading Robots: 优先队列贪心
链接
传送门: here
题意
有
n
(
1
e
5
)
n(1e5)
n(1e5)辆车在数轴正半轴,每个车在初始位置在
p
i
p_i
pi、初速度
0
0
0,加速度
a
i
a_i
ai,可能有车信息完全相同,问有多少辆车存在某一个时刻它走在当之无愧的第一名,也就是没有并列。
思路
1.把所有车子
u
n
i
q
u
e
unique
unique一下,相同车子记录他的个数(当然如果它个数大于
1
1
1,我是不会算它的贡献滴)
2.用单调栈预处理一下,去掉永远不可能在第一位的车子。
3.用
r
s
[
]
rs[]
rs[]记录每个车子下一个要超过的车子的编号
4.优先队列保存每个车子
i
i
i超过车子
r
s
[
i
]
rs[i]
rs[i]的时间,优先队列每次取出时间最短的那个车子
6.判断他是否超车到了第一位,若是就记录,并且若这是最初排在最后一位的车子就break结束
5.然后去掉
r
s
[
i
]
rs[i]
rs[i]这个车子,因为他还没到第一就已经被车子
i
i
i超车了
6.复杂度
O
(
n
∗
l
o
g
(
n
)
)
O(n*log(n))
O(n∗log(n))
备注
去年多校也有一个车子过红绿灯贪心题HDU Vacation
AC_CODE
here
第二场多校 出题人 Claris
1007 In Search of Gold: 二分+树dp
链接
传送门: here
题意
n
(
2
e
4
)
,
k
(
20
)
n(2e4),k(20)
n(2e4),k(20),
n
n
n个节点的树,每条边有两种长度属性
(
a
,
b
)
(a,b)
(a,b),已知恰好有
k
k
k条边长度
属性为
a
a
a,其他边均为
b
b
b,问这种树的直径最小可能时多少。
思路
二分答案+树形DP
初始化
d
p
[
u
]
[
0
]
=
0
,
d
p
[
u
]
[
1
−
k
]
=
I
N
F
dp[u][0]=0,dp[u][1-k]=INF
dp[u][0]=0,dp[u][1−k]=INF
d
p
[
u
]
[
i
]
dp[u][i]
dp[u][i]表示u的子树内有
i
i
i条边选择树形值
a
a
a的情况下的最长叶子路径
状态转移时确保直径小于等于
m
i
d
mid
mid即可。
若
d
p
[
1
]
[
k
]
≤
m
i
d
dp[1][k]\le mid
dp[1][k]≤mid表示有解。
备注
AC_CODE
here
第三场多校 出题人 Tokitsukaze and Her Friends
1006_6796 X Number: 数位dp
链接
传送门: here
题意
f
(
x
)
f(x)
f(x)等于
x
x
x中出现次数最多的那一个数字。
问
l
,
r
l,r
l,r中有几个数字
f
(
x
)
=
d
,
0
≤
d
≤
9
f(x)=d,0\le d\le 9
f(x)=d,0≤d≤9.
思路
数
位
d
p
数位dp
数位dp同时要记录前面各位选的数字的次数,可用大小为
10
10
10的
a
r
r
a
y
array
array存起来
为了保证能正确的记忆化,这个
a
r
r
a
y
array
array应该占
d
p
dp
dp的一维状态,所以只能用
m
a
p
map
map表示
d
p
dp
dp状态
m
a
p
<
a
r
r
a
y
<
i
n
t
,
10
>
,
i
n
t
64
>
d
p
[
d
]
[
p
o
s
]
[
l
e
a
d
Z
e
r
o
]
map<array<int, 10>, int64> dp[d][pos][leadZero]
map<array<int,10>,int64>dp[d][pos][leadZero]
表示只考虑
d
d
d类数,
p
o
s
pos
pos前的位数,是否有前导
0
0
0,数字使用情况为
a
r
r
a
y
array
array的合法方案数。
仅当
!
l
i
m
i
t
!limit
!limit时才记忆化。
当数字使用情况为
a
r
r
a
y
array
array所记录,且还能使用
p
o
s
pos
pos位任意
0
−
9
0-9
0−9数字时,想要让众数为d的方案数
可以使用
母
函
数
D
P
母函数DP
母函数DP写出来,复杂度
O
(
n
4
)
O(n^4)
O(n4)。
算法时间复杂度我猜为
O
(
进
制
数
∗
位
数
+
进
制
数
∗
新
增
状
态
数
∗
1
8
4
)
O(进制数*位数+进制数*新增状态数*18^4)
O(进制数∗位数+进制数∗新增状态数∗184)
备注
AC_CODE
here
第四场多校 出题人 Hangzhou Xuejun Contest
第五场多校 出题人 福州大学
1007 Tree: 优先队列贪心维护换根dp
链接
传送门: here
题意
n
(
2
e
5
)
n(2e5)
n(2e5)个点的带边权的树,选出一个连通子图,保证至多只有一个点的度数可以大
于
k
(
0
≤
k
<
n
)
k(0\le k\lt n)
k(0≤k<n),问这种子图的最大边权和。
思路
换根
d
p
dp
dp+优先队列贪心
d
p
[
u
]
[
0
]
dp[u][0]
dp[u][0]表示至多选出
u
u
u的
k
−
1
k-1
k−1个子树的最大边权和
d
p
[
u
]
[
1
]
dp[u][1]
dp[u][1]表示至多选出
u
u
u的
k
k
k个子树的最大边权和
d
p
[
u
]
[
1
]
=
∑
m
a
x
k
v
(
d
p
[
v
]
[
0
]
+
w
u
v
)
dp[u][1] = \sum_{max\;k\;v} (dp[v][0]+w_{uv})
dp[u][1]=∑maxkv(dp[v][0]+wuv)
选出最大的
k
k
k个
d
p
[
v
]
[
0
]
+
w
u
v
dp[v][0]+w_{uv}
dp[v][0]+wuv转移即可,优先队列贪心维护最大的
k
k
k个。
k
_
s
o
n
_
v
a
l
[
u
]
k\_son\_val[u]
k_son_val[u]表示
u
u
u的第
k
k
k大的子树权值和:
d
p
[
v
]
[
0
]
+
w
u
v
dp[v][0]+w_{uv}
dp[v][0]+wuv
m
a
x
_
k
1
_
s
o
n
[
v
]
max\_k1\_son[v]
max_k1_son[v]表示
v
v
v是否属于其父亲子树中权值和最大的
k
−
1
k-1
k−1个子树
备注
AC_CODE
here
第六场多校 出题人 USETC
1001 Road To The 3rd Building: 期望线性性
链接
传送门: here
题意
n
(
2
e
5
)
n(2e5)
n(2e5)的序列,求每个区间平均值的期望。
思路
算每个数字的期望加起来即可。
备注
AC_CODE
here
1005 Fragrant numbers: 区间DP
链接
传送门: here
题意
求114514191911451419191145141919一个最短前缀,添加任意(,),+,*后数值为
n
(
5000
)
n(5000)
n(5000).
思路
O
(
1
3
3
∗
n
2
)
O(13^3*n^2)
O(133∗n2)区间dp即可。
备注
1007 A Very Easy Math Problem: 莫比乌斯反演
链接
传送门: here
题意
T
≤
1
e
4
,
n
≤
2
e
5
,
k
,
x
≤
1
e
9
T\le1e4,n\le2e5,k,x\le1e9
T≤1e4,n≤2e5,k,x≤1e9
求:
∑
a
1
=
1
n
.
.
.
∑
a
x
=
1
n
(
∏
j
=
1
x
a
j
k
)
×
f
(
g
c
d
(
a
1
,
.
.
.
,
a
x
)
)
×
g
c
d
(
a
1
,
.
.
.
,
a
x
)
\sum_{a_1=1}^n...\sum_{a_x=1}^n(\prod_{j=1}^xa_j^k)\times f(gcd(a_1,...,a_x))\times gcd(a_1,...,a_x)
a1=1∑n...ax=1∑n(j=1∏xajk)×f(gcd(a1,...,ax))×gcd(a1,...,ax)
思路
∑
a
1
=
1
n
.
.
.
∑
a
x
=
1
n
(
∏
j
=
1
x
a
j
k
)
=
(
∑
i
=
1
n
i
k
)
x
\sum_{a_1=1}^n...\sum_{a_x=1}^n(\prod_{j=1}^xa_j^k)=(\sum_{i=1}^ni^k)^x
a1=1∑n...ax=1∑n(j=1∏xajk)=(i=1∑nik)x
容易推导出:
⇓
\Downarrow
⇓
∑
d
=
1
n
f
(
d
)
d
x
k
∑
p
=
1
n
d
μ
(
p
)
×
p
x
k
×
S
(
n
p
d
)
\sum_{d=1}^nf(d)d^{xk}\sum_{p=1}^{\frac nd}\mu(p)\times p^{xk}\times S(\frac n{pd})
d=1∑nf(d)dxkp=1∑dnμ(p)×pxk×S(pdn)
比赛时的测评机全部预处理
O
(
n
×
n
+
T
n
)
O(n\times \sqrt n+T\sqrt n)
O(n×n+Tn)即可通过,比赛后的测评机记忆化处理也能过。
还可以进一步优化。
⇓
\Downarrow
⇓
T
=
p
d
,
∑
T
=
1
n
S
(
n
T
)
×
T
x
k
∑
p
∣
T
μ
(
p
)
f
(
T
p
)
T=pd,\sum_{T=1}^nS(\frac nT)\times T^{xk}\sum_{p|T}\mu(p)f(\frac Tp)
T=pd,T=1∑nS(Tn)×Txkp∣T∑μ(p)f(pT)
备注
由于出题人不卡时限,所以
O
(
n
×
l
o
g
(
n
)
+
T
n
)
O(n\times log(n)+T\sqrt n)
O(n×log(n)+Tn)或者
O
(
n
+
T
n
)
O(n+T\sqrt n)
O(n+Tn)均可以通过。
AC_CODE
here
线性筛代码:
const int mod = 1e9 + 7;
int fpow (int a, int b) { int ret = 1; while (b) { if (b & 1) ret = 1ll * ret * a % mod; a = 1ll * a * a % mod; b >>= 1; } return ret; }
int add (int a, int b) { return (a += b) >= mod ? a - mod : a; }
int sub (int a, int b) { return (a -= b) >= 0 ? a : a + mod; }
int mul (long long a, int b) { return a * b % mod; }
int inv (int a) { return fpow(a, mod - 2); }
int p[N], pc;
bool ptag[N];
int f[N], low[N];
void sieve (int n = N - 1) {
f[1] = low[1] = 1;
for (int i = 2; i <= n; i++) {
if (!ptag[i]) {
p[++ pc] = i;
f[i] = sub(i, 1);
low[i] = i;
}
for (int j = 1, k; j <= pc && i * p[j] <= n; j++) {
ptag[k = i * p[j]] = 1;
if (i % p[j]) {
low[k] = p[j];
f[k] = mul(f[i], f[p[j]]);
} else {
low[k] = low[i] * p[j];
if (low[i] == i) {
if (low[i] == p[j])
f[k] = sub(mod, p[j]);
else
f[k] = 0;
} else
f[k] = mul(f[i / low[i]], f[low[i] * p[j]]);
break;
}
}
}
}
1008 Yukikaze and Smooth numbers: min25筛
待补
CCPC网络赛 出题人:北大出题组
Xor: 数位dp
题意
T
:
2
e
3
T:2e3
T:2e3,
a
b
c
d
:
1
e
9
abcd:1e9
abcd:1e9
问有多少对
(
x
,
y
)
(x, y)
(x,y)满足
∣
x
−
y
∣
≤
c
|x-y|\le c
∣x−y∣≤c且
x
⨁
y
≤
d
,
0
≤
x
≤
a
,
0
≤
y
≤
b
x\bigoplus y \le d, 0\le x\le a, 0\le y\le b
x⨁y≤d,0≤x≤a,0≤y≤b。
链接:点我点我
思路
两个限制条件:
-
x
o
r
xor
xor
ip1 = 1 means equal to c, ip1 = 0 means less than c -
a
b
s
abs
abs
∣ x − y ∣ ≤ m ⟹ x − y ≤ m & & x − y ≥ − m |x - y| \leq m\Longrightarrow\;\; x-y \le m\;\&\&\;x-y\ge -m ∣x−y∣≤m⟹x−y≤m&&x−y≥−m
⟹ m − x + y > = 0 & & m + x − y > = 0 \Longrightarrow m - x + y >= 0\;\&\&\;m + x - y >= 0 ⟹m−x+y>=0&&m+x−y>=0.
m , x , y m, x, y m,x,y 可取 0 或 1, 上述式子取值可以是 − 1 , 0 , 1 , 2 -1, 0, 1, 2 −1,0,1,2.
若 [ 高 位 ] ≥ 1 [高位] \ge 1 [高位]≥1 , 后面数位就算全取-1最后结果还满足条件, x , y x,y x,y取值不受限制。此位就算大于1也可以按1考虑;
若 [ 高 位 ] < − 1 [高位] \lt -1 [高位]<−1 ,后面就算全取2也一定不行 ,所以直接返回0就行;
又因为只有两个值同时大于等于1的时候才可以返回1。
所以只需考虑上述式子取值为1或0或-1的情况。
为避免负数下标,令-1为0,0为1,1为2
AC_CODE
here