poj 3233 S = A + A^2 + A^3 + … + A^k A是一个n X n矩阵 (矩阵快速幂)
S = A + A^2 + A^3 + … + A^k A是一个n*n矩阵
Sample Input
2 2 4 //n k MOD
0 1
1 1
Sample Output
1 2
2 3
先求 I + A + A^2 + A^3 + … + A^k I为单位矩阵
我们来设置这样一个矩阵 B=
A I
O I
其中O是零矩阵,I是单位矩阵
将它乘方,得到
A^2 I+A
O I
乘三方,得到
A^3 I+A+A^2
O I
乘四方,得到
A^4 I+A+A^2+A^3
O I
然后B^(k+1) 的右上小矩阵 就是 I + A + A^2 + A^3 + … + A^k
记得 数组开大一点...因为要扩展成2n*2n的矩阵, 第一次开小了,数组越界=.=
# include <iostream>
# include <cstdio>
# include <algorithm>
# include <cmath>
# define LL long long
using namespace std ; int MOD ;
int n ; struct Matrix
{
LL mat[][];
}; Matrix mul(Matrix a,Matrix b)
{
Matrix c;
for(int i=;i<*n;i++)
for(int j=;j<*n;j++)
{
c.mat[i][j]=;
for(int k=;k<*n;k++)
{
c.mat[i][j]=(c.mat[i][j] + a.mat[i][k]*b.mat[k][j])%MOD;
}
}
return c;
}
Matrix pow_M(Matrix a,int k )
{
Matrix ans;
memset(ans.mat,,sizeof(ans.mat));
for (int i=;i<*n;i++)
ans.mat[i][i]=;
Matrix temp=a;
while(k)
{
if(k&)ans=mul(ans,temp);
temp=mul(temp,temp);
k>>=;
}
return ans;
} int main ()
{
//freopen("in.txt","r",stdin) ;
int k ;
while(cin>>n>>k>>MOD)
{
Matrix A ;
int i , j ;
for (i = ; i < n ; i++)
for (j = ; j < n ; j++)
cin>>A.mat[i][j] ;
Matrix B ;
memset(B.mat,,sizeof(B.mat));
for (i = ; i < n ; i++) //扩展成2n * 2n的矩阵
{
for (j = ; j < n ; j++)
{
B.mat[i][j] = A.mat[i][j] ;
}
B.mat[n+i][n+i] = ;
B.mat[i][n+i] = ; }
B = pow_M(B,k+) ;
LL t ;
for (i = ; i < n ; i++)
for (j = ; j < n ; j++)
{
t = B.mat[i][n+j] % MOD ;
if (i == j)
t = (t + MOD - )%MOD ;
if (j+ != n)
cout<<t<<" " ;
else
cout<<t<<endl ;
} } return ;
}
poj 3233 S = A + A^2 + A^3 + … + A^k A是一个n X n矩阵 (矩阵快速幂)的更多相关文章
- Poj 3233 Matrix Power Series(矩阵二分快速幂)
题目链接:http://poj.org/problem?id=3233 解题报告:输入一个边长为n的矩阵A,然后输入一个k,要你求A + A^2 + A^3 + A^4 + A^5.......A^k ...
- 矩阵儿快速幂 - POJ 3233 矩阵力量系列
不要管上面的标题的bug 那是幂的意思,不是力量... POJ 3233 Matrix Power Series 描述 Given a n × n matrix A and a positive in ...
- POJ 3233 Matrix Power Series (矩阵+二分+二分)
题目地址:http://poj.org/problem?id=3233 题意:给你一个矩阵A,让你求A+A^2+……+A^k模p的矩阵值 题解:我们知道求A^n我们可以用二分-矩阵快速幂来求,而 当k ...
- POJ 3233 Matrix Power Series(矩阵高速功率+二分法)
职务地址:POJ 3233 题目大意:给定矩阵A,求A + A^2 + A^3 + - + A^k的结果(两个矩阵相加就是相应位置分别相加).输出的数据mod m. k<=10^9. 这 ...
- POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】
任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K To ...
- poj 3233 Matrix Power Series 矩阵求和
http://poj.org/problem?id=3233 题解 矩阵快速幂+二分等比数列求和 AC代码 #include <stdio.h> #include <math.h&g ...
- 矩阵十点【两】 poj 1575 Tr A poj 3233 Matrix Power Series
poj 1575 Tr A 主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575 题目大意:A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的 ...
- poj 3233 矩阵快速幂
地址 http://poj.org/problem?id=3233 大意是n维数组 最多k次方 结果模m的相加和是多少 Given a n × n matrix A and a positive i ...
- POJ 3233 Matrix Power Series (矩阵乘法)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 11954 Accepted: ...
随机推荐
- JAVA记录-redis缓存机制介绍(三)
Redis 事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的 ...
- Java编程思想 学习笔记4
四.控制执行流程 1.true和false 所有条件语句都利用条件表达式的真或假来决定执行路径.注意Java不允许我们将一个数字作为布尔值使用. 2.if-else 3.迭代 while.do-whi ...
- The provider is not compatible with the version of Oracle client
保留下安装文件夹里的所有文件.然后把我那个很小应用软件(需要访问远程的oracle数据库)放在这个文件夹里.删除一下直接感觉无用的文件,先抽取可 能用不着的文件,保留放在另一个备用的文件夹里,然后运行 ...
- 深入理解 RecyclerView 系列之:ItemDecoration
https://blog.piasy.com/2016/03/26/Insight-Android-RecyclerView-ItemDecoration/?utm_source=tuicool&am ...
- android handlerThread
一.handlerThread产生的背景
- C++学习2--坦克大战编写-前置知识
基础班学习的这一个多月里的前三周讲解基础的语法,最后一周需要做坦克大战的项目巩固提高自己掌握的语法知识.这个系列博文主要是为了把学习过程中的知识点总结并记录下来: 开发语言与开发工具:C++,VS20 ...
- memset()函数
memset需要的头文件 <memory.h> or <string.h> memset <wchar.h> wmemset 函数介绍 void *memset( ...
- platform_get_resource的分析
阅读platformdriver的代码时,发现在probe函数直接调用platform_get_resource从pdev中获取io内存,但却没有判断传给probe的pdev是否属于这个驱动 ! 后来 ...
- Linux内核驱动--硬件访问I/O【原创】
寄存器与内存 寄存器与内存的区别在哪里呢? 寄存器和RAM的主要不同在于寄存器操作有副作用(side effect或边际效果): 读取某个地址时可能导致该地址内容发生变化,比如很多设备的中断状态寄存器 ...
- HTML表格的简单使用1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...