算法题目:A为矩阵,求S(n)=A^1+A^2+...+A^n 小技巧

本文介绍了一种利用矩阵快速幂解决特定问题的方法,通过二分求和的方式优化了求矩阵A及其幂次之和的过程,并针对不同情况(奇数或偶数次幂)提供了具体的实现思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路:

第一种方法:

题意为给定矩阵A,以及k, mod ,求 A+A^2+A^3+......A^k    的和对mod取余。

一开始用循环k次,递推的做法,超时。。。

看了解题报告,求和的时候要用到二分求和。

所求的和用s(k)表示。

当k为偶数时:

比如 k=6,那么  A+A^2+A^3+A^4+A^5+A^6=    A+A^2+A^3+   A^3*(A+A^2+A^3)   

s(k)=s(k/2)+A^(n/2) * s(k/2) 即s(k)=(E+A^(n/2))*s(n/2)  (E为单位矩阵)

当k为奇数时:

s(k)=s(k-1)+A^k ,  那么k-1为偶数,可以按照上面的二分

matrix call(matrix A,int k)  
{  
    if(k==1) return A;  
    if(k&1)  
        return addmatrix(call(A,k-1),powmatrix(A,k));//当k为奇数时,减1变为偶数 S(K)=S(K-1)+A^K  
    else  
        return mulmatrix(addmatrix(powematrix(A,0),powmatrix(A,k>>1)),call(A,k>>1));  
        //当K为偶数时,S(K)=(1+A^(K/2))*S(K/2)  
} 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值