poj 3233 Matrix Power Series

简介: 点击打开poj 3233 思路: 二分求和+矩阵快速幂 分析: 1 题目给定一个n*n的矩阵A,要求(A+A^2+....A^K)%m后的矩阵 2 对于任意的A^x,我们都能够利用矩阵快速幂求出,但是我们现在要求的是和。

点击打开poj 3233

思路: 二分求和+矩阵快速幂

分析:

1 题目给定一个n*n的矩阵A,要求(A+A^2+....A^K)%m后的矩阵

2 对于任意的A^x,我们都能够利用矩阵快速幂求出,但是我们现在要求的是和。

   仔细观察整个式子,那么我们可以对原式进行变形

   如果k为偶数,那么(A+A^2+....A^K) = (A+...+A^K/2)+A^K/2*(A+...+A^K/2)

   如果k为奇数,那么(A+A^2+....A^K) = (A+...+A^K/2)+A^K/2*(A+...+A^K/2)+A^k

3 那么对于上面的式子的变形,就是二分的思想,那么我们可以利用二分来求和,然后对于单个的矩阵的x次方我们利用快速幂


代码:

/************************************************
 * By: chenguolin                               * 
 * Date: 2013-08-28                             *
 * Address: http://blog.csdn.net/chenguolinblog *
 ************************************************/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 30;

int n , k , MOD;
struct Matrix{
    int mat[N][N];
    Matrix operator*(const Matrix& m)const{
        Matrix tmp;
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < n ; j++){
                tmp.mat[i][j] = 0;
                for(int k = 0 ; k < n ; k++)
                    tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%MOD;
                tmp.mat[i][j] %= MOD;
            }
        }
        return tmp;
    }
    Matrix operator+(const Matrix& m)const{
        Matrix tmp;
        for(int i = 0 ; i < n ; i++)
            for(int j = 0 ; j < n ; j++)
                tmp.mat[i][j] = (mat[i][j]+m.mat[i][j])%MOD;
        return tmp;
    }
};

Matrix Pow(Matrix m , int t){
    Matrix ans;
    memset(ans.mat , 0 , sizeof(ans.mat));
    for(int i = 0 ; i < n ; i++)
        ans.mat[i][i] = 1;
    while(t){
        if(t&1)
            ans = ans*m;
        t >>= 1;
        m = m*m;
    }
    return ans;
}

Matrix solve(Matrix m , int t){
    Matrix A;
    memset(A.mat , 0 , sizeof(A.mat));
    for(int i = 0 ; i < n ; i++)
        A.mat[i][i] = 1;
    if(t == 1)
        return m;
    if(t&1)
        return (Pow(m,t>>1)+A)*solve(m,t>>1)+Pow(m , t);       
    else
        return (Pow(m,t>>1)+A)*solve(m,t>>1);       
}

void output(Matrix ans){
    for(int i = 0 ; i < n ; i++){
        printf("%d" , ans.mat[i][0]%MOD);
        for(int j = 1 ; j < n ; j++)
            printf(" %d" , ans.mat[i][j]%MOD);
        puts("");
    }
}

int main(){
    Matrix m , ans;
    while(scanf("%d%d%d" , &n , &k , &MOD) != EOF){
         for(int i = 0 ; i < n ; i++)
            for(int j = 0 ; j < n ; j++)
                scanf("%d" , &m.mat[i][j]);
         ans = solve(m , k);
         output(ans);
    }
    return 0;
}



目录
相关文章
|
数据采集 存储 监控
淘宝详情数据采集(商品上货,数据分析,属性详情,价格监控),海量数据值得get
淘宝详情数据采集涉及多个环节,包括商品上货、数据分析、属性详情以及价格监控等。在采集这些数据时,尤其是面对海量数据时,需要采取有效的方法和技术来确保数据的准确性和完整性。以下是一些关于淘宝详情数据采集的建议:
|
iOS开发
iOS 逆向编程(十三)PS命令获取进程PID与名称(Process Status)
iOS 逆向编程(十三)PS命令获取进程PID与名称(Process Status)
437 0
|
算法 网络安全 数据安全/隐私保护
【密码学】手摸手带你手算AES
本文带着大家手动计算了一下完整的简化版AES的整个流程,其实主要都参考了密码学与网络安全这本书,大部分的公式都是从这本书上来的,我是真的喜欢这个例子,麻雀虽小,五脏俱全,用来学习AES的入门感觉非常的合适,如果能够完整的自己手算下来这个例子,然后再去看完整版的AES算法,会简单非常多,主要就是规模扩大了一下,核心的流程还是上面这一套。最后,感谢能看到这里的读者,如果本文对大佬们理解AES有一点点的帮助,也不枉我手动敲了这么多的公式和矩阵了。
1290 0
【密码学】手摸手带你手算AES
|
Java 持续交付 数据库
避免服务分层污水池反模式
【6月更文挑战第30天】本文介绍污水池反模式,分层架构在敏捷性、部署性和性能方面得分较低,但具有高测试性和易开发性。关键在于合理分层以降低耦合和提高解耦效果。
616 1
避免服务分层污水池反模式
|
自然语言处理 搜索推荐 BI
有哪些好用的待办事项提醒软件?主流7款大对比
随着生活和工作节奏的加快,待办事项提醒软件成为了我们的“救命神器”。本文评测了7款主流的待办事项软件:板栗看板、Todoist、Microsoft To Do、TickTick、Google Keep、Any.do 和滴答清单,从功能、适用场景和优缺点等方面进行对比,帮助你找到最适合自己的那一款。无论是团队协作、个人时间管理还是生活与工作的平衡,总有一款能满足你的需求。
5475 1
|
12月前
|
前端开发 UED 开发者
React 日期选择器 Date Picker
本文从React的角度探讨了日期选择器的使用方法,包括使用`react-datepicker`库的基本配置、自定义样式、国际化设置、常见问题及解决方案,旨在帮助开发者构建用户友好的日期选择组件。
405 12
|
消息中间件 前端开发 Java
阿里中间件seata源码剖析一:聊聊RM和TM客户端初始化
阿里中间件seata源码剖析一:聊聊RM和TM客户端初始化
463 79
阿里中间件seata源码剖析一:聊聊RM和TM客户端初始化
|
SQL 存储 数据处理
Flink SQL 问题之提交程序运行报错如何解决
Flink SQL报错通常指在使用Apache Flink的SQL接口执行数据处理任务时遇到的问题;本合集将收集常见的Flink SQL报错情况及其解决方法,帮助用户迅速恢复数据处理流程。
580 3
|
算法 API Python
使用 Python 对接阿里云 OpenAPI 自签名
使用 Python 对接阿里云 OpenAPI 自签名
786 1
|
索引
在微信小游戏制作工具中实现文字逐个出现的打字机效果
在微信小游戏制作工具中实现文字逐个出现的打字机效果
321 0