POJ 3233 矩阵快速幂&二分

本文介绍了一种解决特定矩阵问题的方法,通过使用矩阵快速幂和递归技巧,实现了高效求解复杂矩阵运算的目标。文章提供了详细的算法实现过程,并通过代码示例展示了如何将理论应用于实践。

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

题意:
给你一个n*n的矩阵 让你求S:
思路:
只知道矩阵快速幂 然后nlogn递推是会TLE的。

所以呢 要把那个n换成log

那这个怎么搞呢

二分!

当k为偶数时:

当k为奇数时:

就按照这么搞就能搞出来了
(我是看的题解才A的,,, 中间乱搞的时候犯了一些脑残的错误)

// by SiriusRen
#include <cstdio>
#include <cstring>
using namespace std;
int n,mod,k;
struct matrix{int a[33][33];void init(){memset(a,0,sizeof(a));}}first;
matrix mul(matrix a,matrix b){
    matrix temp;temp.init();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                temp.a[i][j]=(temp.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
    return temp;
}
matrix add(matrix a,matrix b){
    matrix temp;temp.init();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
            temp.a[i][j]=(a.a[i][j]+b.a[i][j])%mod;
    return temp;
} 
matrix pow(matrix a,int x){
    matrix temp;
    x--;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            temp.a[i][j]=a.a[i][j];
    while(x){
        if(x&1)temp=mul(temp,a);
        a=mul(a,a),x>>=1;
    }
    return temp;
}
matrix recursive(int x){
    if(x==1)return first;
    matrix temp=recursive(x/2);
    if(x&1){
        matrix jy=pow(first,x/2+1);
        temp=add(temp,mul(temp,jy));
        return add(jy,temp);
    }
    else{
        matrix jy=pow(first,x/2);
        return add(mul(jy,temp),temp);
    }
}
int main(){
    scanf("%d%d%d",&n,&k,&mod);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            scanf("%d",&first.a[i][j]);
            first.a[i][j]=first.a[i][j]%mod;
        }
    matrix jy=recursive(k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<n;j++)
            printf("%d ",jy.a[i][j]);
        printf("%d\n",jy.a[i][n]);
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值