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 ...
随机推荐
- 使用shell脚本获取虚拟机中cpu使用率(读/proc/statc)
#!/bin/bash interval= cpu_num=`-] -c` start_idle=() start_total=() cpu_rate=() cpu_rate_file=./`host ...
- XML 实体扩展攻击
XMl Entity Expansion(攻击)某种程度上类似于 XML Entity Expansion,但是它主要试图通过消耗目标程序的服务器环境来进行DOS攻击的.这种攻击基于XML Entit ...
- js正则函数match、exec、test、search、replace、split使用介绍
match() 使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回. stringObj.match(rgExp) stringObj 必选项.对其进行查找的 String 对象或字符 ...
- 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)
题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...
- Java运行系统命令并获取值(Process java.lang.Runtime.exec(String[] cmdarray, String[] envp, File dir)
package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; ...
- lintcode 中等题:digits counts 统计数字
题目 统计数字 计算数字k在0到n中的出现的次数,k可能是0~9的一个值 样例 例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现 ...
- 机器学习 —— 概率图模型(Homework: Exact Inference)
在前三周的作业中,我构造了概率图模型并调用第三方的求解器对器进行了求解,最终获得了每个随机变量的分布(有向图),最大后验分布(双向图).本周作业的主要内容就是自行编写概率图模型的求解器.实际上,从根本 ...
- android下activity中多个listview只允许主界面滚动
之前发现了自己的APP在处理两个listview时产生的一个bug.当两个listview中的item数量多出手机屏幕时,listview不能显示完全.一开始觉得只要加一个scrollview就可以了 ...
- Codeforces Beta Round #9 (Div. 2 Only)D
短小精悍的代码 dp[i][j] +=dp[k][j-1]*[i-k-1][j-1] i个结点 J层 #include <iostream> #include<cstdio> ...
- MemSQL Start[c]UP 2.0 - Round 1 B. 4-point polyline (线段的 枚举)
昨天cf做的不好,居然挂零了,还是1点开始的呢.,,, a题少了一个条件,没判断长度. 写一下B题吧 题目链接 题意: 给出(n, m),可以得到一个矩形 让你依次连接矩形内的4个点使它们的长度和最长 ...