NYG的序列拆分 详解(递推矩阵快速幂)

博客详细介绍了如何使用递推矩阵快速幂解决序列拆分问题,通过对不同算法的分析,逐步引入矩阵乘法优化,将复杂度降低到O(log n log3 r + r^2 log r),并解释了矩阵如何构造以维持递推关系。
摘要由CSDN通过智能技术生成

9.19
思路:
题目描述有点恼火,其实就是列出所有合法的数(由n个[l,r]的数组成),然后把数分为连续的若干段让每一段都是一个等比数列,计算方案总数。
std的题解:
算法一
直接按定义计算,O(rnn!),期望得分10。
算法二
r <= 2,可以推递推式,期望得分10。
算法三
注意到题目实际上是这样一个问题:将若干个等比数列拼成一个长度为n的序列,有多少种方案。由于数列中的数都是整数,除去公比为1的情况,每个等比数列的长度都不会很长,最长为log r。
这样我们可以直接求出所有可能的等比数列,不妨枚举其首项和公比,即可在O(r^2 log r)时间内找出所有等比数列,接下来O(n)递推即可,期望得分40。
算法四
矩阵乘法优化递推,复杂度降为O(log n log3 r + r2 log r),期望得分50。
算法五
对于r <= 10^5, 可能存在一些复杂度不够优的找等比数列的方法,矩阵乘法优化的情况下可获得70分。
算法六
复杂度瓶颈在于找等比数列,考虑优化。
由于公比一定是有理数,不妨设其为x/y,由于公比大于1的等比数列的个数跟小于1的数量是完全相同的,不妨设x > y,设等比数列长为n,则an = x^(n-1)/y^(n-1)*a1,不妨令t = an^(x1-n) =
a1^y(1-n),注意到一旦x,y确定,由于an = t x^(n-1) <= r; a1 = t y^(n-1) >= l,合法的t的个数为这里写图片描述
对于n = 1; n = 2个数特殊处理,接下来再枚举x,y即可,注意可能会算重,还需要保证gcd(x,y)=1。注意到此时由于n>=3,我们只需要在sqrt(r)内枚举x,y即可。
总的复杂度为O(log n log3 r + r log r),事实上还达不到这个复杂度。

接下来我来说说矩阵到底是这么构造的(std嫌问题太蠢啦根本不讲)【摊手
f(i)表示n==i时的ans。
显然有f(i) = f(i-1) * cnt1 + f(i-2) * cnt2 + f(i-3) * cnt3……
考虑构造矩阵:
首先肯定有:
cnt1
cnt2
cnt3
cnt4


0
(姑且叫做矩阵1)
最后要把我们的ans也就是f(n)放在0,0的位置(我们把ans矩阵称作矩阵2)。
而0,0是由矩阵2的第一行乘上矩阵1的第一列(反过来也可以,转一转矩阵也无所谓啦)。
所以矩阵2的第一行也就出来啦
ai,a(i-1) ,a(i-2) ,a(i-3) ,a(i-4),…1, 0, 0…0
要让矩阵2一直保证这种状态,就要对矩阵1做出一些改变了。
cnt1 1 0 0…0
cnt2 0 1 0…0
cnt3 0 0 1…0
cnt4 0 0 0…0
.… 0 0 0…0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值