POJ 3233 Matrix Power Serie
题意:给一个n×n的矩阵A,求S = A + A2 + A3 + … + Ak。
解法:从式子中可得递推式S(n) = S(n - 1) + An,An = An-1×A,可得矩阵递推式
[S(n), An] = [S(n - 1), An-1] * [1 0]
[A A] <-orz画不出二维矩阵了
初始状态S(0)为0矩阵,A0为单位矩阵,跑一下矩阵快速幂……
矩阵运算写屎了……调了一下午bugQAQ……矩阵套矩阵什么的好讨厌啊……
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<iomanip>
#define LL long long
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1 using namespace std; struct node
{
int a[35][35];
}matrix;
int n = 2, m = 100;
node mul(node a, node b)
{
node res;
memset(res.a, 0, sizeof res.a);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
int tmp = 0;
for(int k = 0; k < n; k++)
{
tmp += a.a[i][k] * b.a[k][j];
tmp %= m;
}
res.a[i][j] = tmp;
}
return res;
}
void ADD(node &a, node b)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
a.a[i][j] += b.a[i][j];
a.a[i][j] %= m;
}
}
void MUL(node a[][2], node b[][2], int x)
{
node res[2][2];
for(int i = 0; i < x; i++)
for(int j = 0; j < 2; j++)
{
node tmp;
memset(tmp.a, 0, sizeof tmp.a);
for(int k = 0; k < 2; k++)
ADD(tmp, mul(a[i][k], b[k][j]));
res[i][j] = tmp;
}
for(int i = 0; i < x; i++)
for(int j = 0; j < 2; j++)
a[i][j] = res[i][j];
}
node POW(int k)
{
node base[2][2];
memset(base[0][0].a, 0, sizeof base[0][0].a);
for(int i = 0; i < n; i++)
base[0][0].a[i][i] = 1;
memset(base[0][1].a, 0, sizeof base[0][1].a);
base[1][1] = base[1][0] = matrix;
node x[1][2];
memset(x[0][0].a, 0, sizeof x[0][0].a);
memset(x[0][1].a, 0, sizeof x[0][1].a);
for(int i = 0; i < n; i++)
x[0][1].a[i][i] = 1;
while(k)
{
if(k & 1)
MUL(x, base, 1);
k >>= 1;
MUL(base, base, 2);
}
return x[0][0];
}
int main()
{
int k;
while(~scanf("%d%d%d", &n, &k, &m))
{
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
scanf("%d", &matrix.a[i][j]);
matrix.a[i][j] %= m;
}
node ans = POW(k);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(j) printf(" ");
printf("%d", ans.a[i][j]);
}
puts("");
}
}
return 0;
}
POJ 3233 Matrix Power Serie的更多相关文章
- 矩阵十点【两】 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 Matrix Power Series 【经典矩阵快速幂+二分】
任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K To ...
- 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 (矩阵乘法)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 11954 Accepted: ...
- [ACM] POJ 3233 Matrix Power Series (求矩阵A+A^2+A^3...+A^k,二分求和或者矩阵转化)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 15417 Accepted: ...
- Poj 3233 Matrix Power Series(矩阵乘法)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Description Given a n × n matrix A and ...
- 线性代数(矩阵乘法):POJ 3233 Matrix Power Series
Matrix Power Series Description Given a n × n matrix A and a positive integer k, find the sum S = ...
- POJ 3233 Matrix Power Series(二分等比求和)
Matrix Power Series [题目链接]Matrix Power Series [题目类型]二分等比求和 &题解: 这题我原来用vector写的,总是超时,不知道为什么,之后就改用 ...
- POJ 3233 Matrix Power Series(矩阵快速幂)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 19338 Accepted: 8161 ...
随机推荐
- C# 使用TimeSpan计算两个时间差
转载:http://www.cnblogs.com/wifi/articles/2439916.html 可以加两个日期之间任何一个时间单位. private string DateDiff(Date ...
- Javascript操作表格隔行变色
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 使用git代替FTP部署代码到服务器的例子
这篇文章主要介绍了使用git代替FTP部署代码到服务器的例子,这种方法可以节省流量.节省时间,需要的朋友可以参考下 本地开发完成后,通常会在服务器上部署,有人会使用ftp,有人会使用scp, ftp和 ...
- linux入门教程(十) 文档的压缩与打包
在windows下我们接触最多的压缩文件就是.rar格式的了.但在linux下这样的格式是不能识别的,它有自己所特有的压缩工具.但有一种文件在windows和linux下都能使用那就是.zip格式的文 ...
- Unix编程之size_t、ssize_t
http://blog.csdn.net/lalor/article/details/7426184 首先,我非常肯定以 及确定的告诉你ssize_t是有符号整型,在32位机器上等同与int,在64位 ...
- AngularJS初探:搭建PhoneCat项目的开发与测试环境
AngularJS官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些Android手机,了解它们的详细信息,并进行搜索和排序操作. 对于PhoneCat项目的 ...
- redhat 新装后不能联网
1.ifconfig查看是否有ip地址,如果没有就配置,命令如下: [root@redhat ~]# system-config-network 设置DHCP 为 [*] [ok]后,重新ifconf ...
- DAO设计模式 -- 使用数据库连接类连接MySql数据库并实现添加用户
1. DAO简介 DAO设计模式是属于J2EE数据库层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2. DAO各部分详解 DAO设计模式包括5个重要的部分,分别为数据 ...
- C++异常以及异常与析构函数
1. 抛出异常 1.1 抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常. 该语句的格式为: throw 表达式; 如果在try语句 ...
- AutoResetEvent
private static readonly AutoResetEvent autoResetEvent = new AutoResetEvent(false); private static vo ...