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 ...
随机推荐
- Java的synchronized关键字:同步机制总结
JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程 ...
- Netty 的Downstream 和 Upstream
Netty的Downstream 和 Upstream 如果一个event从第一个handler传递直到最后一个handler就是 Upstream 相反的如果一个event从最后一个handler传 ...
- lintcode:Valid Sudoku 判断数独是否合法
题目: 判断数独是否合法 请判定一个数独是否有效.该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 样例 下列就是一个合法数独的样例. 注意 一个合法的数独(仅部分填充)并不一定是可解的.我们 ...
- Project Euler 77:Prime summations
原题: Prime summations It is possible to write ten as the sum of primes in exactly five different ways ...
- linux 显示当前用户信息
1.w命令 2.who命令 3.who am i 4. users
- HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询
题意: T个测试数据 n个数 q个查询 n个数 ( 下标从0开始) Q u v 查询 [u, v ] 区间最长连续上升子序列 U u v 把u位置改成v #include<iostream> ...
- fedora如何设置上网
设置方法如下:第一步:激活网卡.Fedora Linux系统装好后默认的网卡是eth0,用下面的命令将这块网卡激活.# ifconfig eth0 up.第二步:设置网卡进入系统时启动 .想要每次开机 ...
- MyEclipse开发WebService教程
. 创建一个 webService 工程. 2. 创建一个普通 Java 类 3. 创建 webService 服务端 HelloJaxwsDelegate.java 的源代码如下: 4. 导 ...
- [UVA796]Critical Links(割边, 桥)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 转 Android中进入系统设置界面
Android软件时,常常需要打开系统设置或信息界面,来设置相关系统项或查看系统的相关信息,这时我们就可以使用以下语句来实现:(如打开“无线和网络设置”界面) Intent intent = new ...