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

被折叠的 条评论
为什么被折叠?



