来源:
https://www.luogu.org/contest/20135
A
大意
给你一个序列,要你分成几组,每组代价为该组异或和,总共代价为每组代价和,求最小总共代价。 n ≤ 1 0 6 n\leq 10^6 n≤106
题解
结论:
x
⊕
y
≤
x
+
y
x\oplus y\leq x+y
x⊕y≤x+y
所以全部分成一组最优。
B
大意
令
f
(
n
)
=
n
a
+
n
b
f(n)=n^a+n^b
f(n)=na+nb,给定
a
,
b
,
n
a,b,n
a,b,n,求满足
⌊
f
(
n
′
)
⌋
=
⌊
f
(
n
)
⌋
\lfloor f(n')\rfloor=\lfloor f(n)\rfloor
⌊f(n′)⌋=⌊f(n)⌋的
n
′
n'
n′的范围大小。
T
≤
5
∗
1
0
6
,
4
≤
n
≤
5
,
5
≤
a
,
b
≤
10
T\leq 5*10^6,4\leq n\leq 5,5\leq a,b\leq 10
T≤5∗106,4≤n≤5,5≤a,b≤10
题解
二分显然,TLE,65分(100w会T)。
使用牛顿迭代,每次几乎只需要迭代2次,TLE,80分(500w会T)。
只迭代两次都挂了,说明每组数据只能用两次pow函数,在牛顿迭代之后很久想到,拿斜率近似计算其实也是很准确的,因为牛顿迭代几乎只做了一次,所以每组的
a
n
s
=
1
f
′
(
n
)
ans=\frac{1}{f'(n)}
ans=f′(n)1
D
大意
给出数列 a n = 3 a n − 1 + a n − 2 − 3 a n − 3 + 3 n , a 0 = − 3 , a 1 = − 6 , a 2 = − 12 a_n=3a_{n-1}+a_{n-2}-3a_{n-3}+3^n,a_0=-3,a_1=-6,a_2=-12 an=3an−1+an−2−3an−3+3n,a0=−3,a1=−6,a2=−12,求 a n a_n an。 T = 5 ∗ 1 0 7 , n ≤ 2 64 − 1 T=5*10^7,n\leq 2^{64}-1 T=5∗107,n≤264−1
题解
第一眼当然是矩阵快速幂,但是这么大个T怎么可能每次去算。
然后就开始了漫长的错位相减道路,一直算到比赛结束,赛后一分钟过题,我要是考高考数学的时候算错这么多次我大概已经凉了。
下面是过程:
a
n
−
a
n
−
2
=
3
∗
(
a
n
−
1
−
a
n
−
3
)
+
3
n
a_n-a_{n-2}=3*(a_{n-1}-a_{n-3})+3^n
an−an−2=3∗(an−1−an−3)+3n
3
−
n
∗
(
a
n
−
a
n
−
2
)
=
3
−
n
+
1
∗
(
a
n
−
1
−
a
n
−
3
)
+
1
3^{-n}*(a_n-a_{n-2})=3^{-n+1}*(a_{n-1}-a_{n-3})+1
3−n∗(an−an−2)=3−n+1∗(an−1−an−3)+1
令
数
列
b
n
=
3
−
n
∗
(
a
n
−
a
n
−
2
)
令数列b_n=3^{-n}*(a_n-a_{n-2})
令数列bn=3−n∗(an−an−2)
则
易
得
b
n
=
b
n
−
1
+
1
,
b
2
=
−
1
,
可
知
b
n
=
n
−
3
则易得b_n=b_{n-1}+1,b_2=-1,可知b_n=n-3
则易得bn=bn−1+1,b2=−1,可知bn=n−3
b
n
=
3
−
n
∗
(
a
n
−
a
n
−
2
)
=
n
−
3
b_n=3^{-n}*(a_n-a_{n-2})=n-3
bn=3−n∗(an−an−2)=n−3
a
n
=
3
n
∗
(
n
−
3
)
+
a
n
−
2
a_n=3^n*(n-3)+a_{n-2}
an=3n∗(n−3)+an−2
到这里可以发现,对下标分奇偶之后可以错位相减(过程就省略了,推错了一万次),然后得到:
a
n
=
3
n
+
2
(
4
n
−
13
)
+
21
+
[
n
为
奇
数
]
∗
30
32
a_n=\frac{3^{n+2}(4n-13)+21+[n为奇数]*30}{32}
an=323n+2(4n−13)+21+[n为奇数]∗30
所以一看,复杂度全在
3
n
+
2
3^{n+2}
3n+2上,然后就开始所谓的卡常(我觉得这种log级别的优化不叫卡常233)。首先n可以mod
ϕ
(
p
)
\phi(p)
ϕ(p),这样就在1e9的级别了,也就是预处理出
[
0
,
2
16
−
1
]
[0,2^{16}-1]
[0,216−1]的3的幂次,n一来先把前16位算一下,然后将n右移16位再算,就可以做到O(1)了。感觉并没有卡多少常,这么处理之后就能直接过了,可能是之前开火车遇到的卡常题太多了把,各种bitset,unordered_map,头大。
后记
C并没有做出来,很菜。