博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3233 Matrix Power Series (矩阵分块,递推)
阅读量:7042 次
发布时间:2019-06-28

本文共 1535 字,大约阅读时间需要 5 分钟。

矩阵乘法是可以分块的,而且幂的和也是具有线性的。

不难得到 Si = Si-1+A*Ai-1,Ai = A*Ai-1。然后矩阵快速幂就可以了。

/**********************************************************            ------------------                          **   author AbyssalFish                                   ***********************************************************/#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef vector
row;typedef vector
mat;int n, k, M;mat Mul;mat &operator *(mat &A, mat& B){ mat &R = Mul; R.assign(n,row(n)); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ for(int k = 0; k < n; k++){ R[i][j] = (R[i][j] +A[i][k]*B[k][j])%M; } } } return R;}//#define LOCAL#ifdef LOCALvoid censor(mat &B){ for(auto r: B){ for(int c: r) cout<
<<' '; cout<
>= 1; } return Re;}int main(){#ifdef LOCAL freopen("in.txt","r",stdin);#endif int nn; scanf("%d%d%d",&nn,&k,&M); n = 2*nn; mat A(nn,row(nn)); for(int i = 0; i < nn; i++){ for(int j = 0; j < nn; j++){ scanf("%d",&A[i][j]); } } mat B(n,row(n)); for(int i = 0; i < nn; i++) { B[i][i] = 1; copy(A[i].begin(),A[i].end(),B[i].begin()+nn); copy(A[i].begin(),A[i].end(),B[i+nn].begin()+nn); } B = B^k; for(int i = 0; i < nn; i++){ for(int j = 0; j < nn; j++){ printf("%d%c",B[i][j+nn],j==nn-1?'\n':' '); } }#ifdef LOCAL cout<<"rum time:"<
<<"ms"<

 

 

转载于:https://www.cnblogs.com/jerryRey/p/4945616.html

你可能感兴趣的文章
Redux入门学习
查看>>
我的友情链接
查看>>
利用AWS boto实现EC2 存储卷的自动快照
查看>>
微软私有云解决方案专家认证之路
查看>>
曾经的痛啊 关于 becomeFirstResponder
查看>>
Android Service
查看>>
解决iphone safari上的圆角问题
查看>>
zabbix源码安装
查看>>
phpcms笔记
查看>>
查看系统用户登录信息命令
查看>>
CMS之图片管理(2)
查看>>
php 魔术方法总结(持续更新)
查看>>
利用ADMT进行Exchange跨域迁移之一:配置域信任
查看>>
javascript获取系统当前时间
查看>>
【java解惑】java中那些反常识的小知识
查看>>
bash内部命令变量
查看>>
python3.4 之sqlite3,pymysql
查看>>
网络接口
查看>>
centos下Extmail的搭建
查看>>
我的友情链接
查看>>