【poj3233】 Matrix Power Series
http://poj.org/problem?id=3233 (题目链接)
题意
给出一个n×n的矩阵A,求模m下A+A2+A3+…+Ak 的值
Solution
今日考试就A了这一道题。。
当k为偶数时,原式=(Ak2+1)×(A1+A2+...+Ak2)。
当k为奇数的时候将Ak乘上当前答案后抠出去,最后统计答案时再加上。所以我们就一路快速幂搞过去,AC
代码
// poj3233
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=31;
int A[maxn][maxn],B[maxn][maxn],C[maxn][maxn],T[maxn][maxn],tmp[maxn][maxn],ans[maxn][maxn],D[maxn][maxn];
int n,m; void pow(int k) {
for (int i=1;i<=n;i++) {
for (int j=1;j<=n;j++) B[i][j]=0,T[i][j]=A[i][j];
B[i][i]=1;
}
while (k) {
if (k&1) {
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) {
tmp[i][j]=0;
for (int k=1;k<=n;k++) tmp[i][j]=(tmp[i][j]+B[i][k]*T[k][j])%m;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) B[i][j]=tmp[i][j];
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) {
C[i][j]=0;
for (int k=1;k<=n;k++) C[i][j]=(C[i][j]+T[i][k]*T[k][j])%m;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) swap(C[i][j],T[i][j]);
k>>=1;
}
}
void update() {
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) {
tmp[i][j]=0;
for (int k=1;k<=n;k++) tmp[i][j]=(tmp[i][j]+ans[i][k]*B[k][j])%m;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) ans[i][j]=tmp[i][j];
}
int main() {
int k;
scanf("%d%d%d",&n,&k,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) scanf("%d",&A[i][j]);
memset(ans,0,sizeof(ans));for (int i=1;i<=n;i++) ans[i][i]=1;
while (k>1) {
if (k&1) {
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) T[i][j]=A[i][j];
pow(k);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) {
tmp[i][j]=0;
for (int k=1;k<=n;k++) tmp[i][j]=(tmp[i][j]+B[i][k]*ans[k][j])%m;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) D[i][j]=(D[i][j]+tmp[i][j])%m;
}
pow(k/2);
for (int i=1;i<=n;i++) B[i][i]=(B[i][i]+1)%m;
update();
k>>=1;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) B[i][j]=A[i][j];
update();
for (int i=1;i<=n;i++) {
for (int j=1;j<=n;j++) printf("%d ",(ans[i][j]+D[i][j])%m);
printf("\n");
}
return 0;
}
【poj3233】 Matrix Power Series的更多相关文章
- 【POJ 3233】Matrix Power Series
[题目链接] 点击打开链接 [算法] 要求 A^1 + A^2 + A^3 + ... + A^k 考虑通过二分来计算这个式子 : 令f(k) = A^1 + A^2 + A ^ 3 + ... + ...
- POJ3233 [C - Matrix Power Series] 矩阵乘法
解题思路 题目里要求\(\sum_{i=1}^kA^i\),我们不妨再加上一个单位矩阵,求\(\sum_{i=0}^kA^i\).然后我们发现这个式子可以写成这样的形式:\(A(A(A...)+E)+ ...
- POJ3233:Matrix Power Series
对n<=30(其实可以100)大小的矩阵A求A^1+A^2+……+A^K,K<=1e9,A中的数%m. 从K的二进制位入手.K分解二进制,比如10110,令F[i]=A^1+A^2+……+ ...
- POJ 3233 Matrix Power Series(二分等比求和)
Matrix Power Series [题目链接]Matrix Power Series [题目类型]二分等比求和 &题解: 这题我原来用vector写的,总是超时,不知道为什么,之后就改用 ...
- 构造矩阵解决这个问题 【nyoj299 Matrix Power Series】
矩阵的又一个新使用方法,构造矩阵进行高速幂. 比方拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s. ...
- POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】
任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K To ...
- 矩阵十点【两】 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的迹(就是主对角线上各项的 ...
- [POJ3233]Matrix Power Series 分治+矩阵
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [POJ3233]Matrix Power Series 分治+矩阵 题目大意 A为n×n(n<= ...
- POJ3233 Matrix Power Series 矩阵快速幂 矩阵中的矩阵
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 27277 Accepted: ...
随机推荐
- app:transformClassesWithJarMergingForDebug uplicate entry: android/support/v4/app/BackStackState$1.class
.Execution failed for task ':app:transformClassesWithJarMergingForDebug'.> com.android.build.api. ...
- MVC权限验证之ActionFilterAttribute
参考:http://www.cnblogs.com/waitingfor/archive/2011/12/27/2303784.html ActionFilterAttribute是Action过滤类 ...
- 多线程BackgroundWorker
链接:http://www.cnblogs.com/yiyisawa/archive/2008/11/24/1339826.html 周六闲来无事,学习了多线程BackgroundWorker,以此记 ...
- SpringMVC中的@PathVariable
@PathVariable是用来动态获得url中的参数的,代码示例如下: 可以在代码中获得lev_1.lev_2和target参数的值看一下 // 支持跳转到WEB-INF/目录下二层目录 @Requ ...
- slf4j,log4j,logback 初步使用
log4j,slf4j,logback简单介绍见 LogBack简易教程 Logback浅析 简单的将,slf4j是一个日志的框架,有各种日志的接口,但是并不包含实际的写日志的方法. log4j,lo ...
- Linux常用指令---系统负载
查看linux系统负载: http://www.lupaworld.com/article-217011-1.html在Linux系统中,uptime.top等命令都会有系统平均负载load aver ...
- Activiti系列:如何把Activiti工程转换为maven工程以解决依赖项找不到的问题
在eclipse中安装了Activiti插件之后,就可以新建Activiti工程,但是在实际使用时发现,在该工程中间新建Activiti Diagram,绘制好该图形之后,右键,新建单元测试,选择ju ...
- 20135316王剑桥 linux第七周课实验笔记
第十章.程序间的交互和通信 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程.输入操作是从I/O设备拷贝数据到主存,而输出操作是从主存拷贝数据到I/O设备. 输入:从I/O拷贝到主存,输出:从 ...
- 交流异步电机的Modelica模型
Modelica标准库里的异步电机模型过于复杂,为了便于学习,我用最基本的异步电机方程写了一个Modelica模型,公式参照陈伯时的<电力拖动自动控制系统--运动控制系统>第3版的190页 ...
- [Aaronyang] 写给自己的WPF4.5 笔记[1布局]
挫折时,要像大树一样,被砍了,还能再长:也要像杂草一样,虽让人践踏,但还能勇敢地活下去 --Aaronyang的博客(www.ayjs.net)-www.8mi.me =============时隔两 ...