Matrix Power Series
Time Limit: 3000MS   Memory Limit: 131072K
Total Submissions: 15417   Accepted: 6602

Description

Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.

Input

The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative
integers below 32,768, giving A’s elements in row-major order.

Output

Output the elements of S modulo m in the same way as A is given.

Sample Input

2 2 4
0 1
1 1

Sample Output

1 2
2 3

Source

解题思路:

第一种方法:

题意为给定矩阵A(以下代码中用ori表示)。以及k, mod ,求 A+A^2+A^3+......A^k    的和对mod取余。

一開始用循环k次,递推的做法,超时。

。。

看了解题报告,求和的时候要用到二分求和。

所求的和用s(k)表示。

当k为偶数时:

比方 k=6,那么  A+A^2+A^3+A^4+A^5+A^6=    A+A^2+A^3+   A^3*(A+A^2+A^3)

s(k)=s(k/2)+A^(n/2) * s(k/2) 即s(k)=(E+A^(n/2))*s(n/2)  (E为单位矩阵)

当k为奇数时:

s(k)=s(k-1)+A^k ,  那么k-1为偶数。能够依照上面的二分

PS:代码要写细致啊,否则一个小错误查半天.....计算两个矩阵相乘时ret.arr[i][j]+=a.arr[i][k]*b.arr[k][j]; 居然写成了ret.arr[i][j]+=a.arr[i][k]*a.arr[k][j]; T T

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn=31;
int n,k,mod; struct mat
{
int arr[maxn][maxn];
mat()
{
memset(arr,0,sizeof(arr));
}
}; mat mul(mat a,mat b)
{
mat ret;
for(int i=0;i<n;i++)
for(int k=0;k<n;k++)
{
if(a.arr[i][k])
for(int j=0;j<n;j++)
{
ret.arr[i][j]+=a.arr[i][k]*b.arr[k][j];
if(ret.arr[i][j]>=mod)
ret.arr[i][j]%=mod;
}
}
return ret;
} mat add(mat a,mat b)
{
mat an;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
an.arr[i][j]=a.arr[i][j]+b.arr[i][j];
if(an.arr[i][j]>=mod)
an.arr[i][j]%=mod;
}
return an;
} mat power(mat p,int k)
{
if(k==1) return p;
mat e;
for(int i=0;i<n;i++)
e.arr[i][i]=1;
if(k==0) return e;
while(k)
{
if(k&1)
e=mul(p,e);
p=mul(p,p);
k>>=1;
}
return e;
} void output(mat ans)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(j==n-1)
cout<<ans.arr[i][j]<<endl;
else
cout<<ans.arr[i][j]<<" ";
}
} mat cal(mat ori,int k)
{
if(k==1) return ori;
if(k&1)
return add(cal(ori,k-1),power(ori,k));//当k为奇数时,减1变为偶数 S(K)=S(K-1)+ori^K
else
return mul(add(power(ori,0),power(ori,k>>1)),cal(ori,k>>1));
//当K为偶数时,S(K)=(1+ori^(K/2))*S(K/2)
} int main()
{
while(scanf("%d%d%d",&n,&k,&mod)!=EOF)
{
mat ori,ans;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&ori.arr[i][j]);
if(ori.arr[i][j]>=mod)
ori.arr[i][j]%=mod;
}
ans=cal(ori,k);
output(ans);
}
return 0;
}

另外一种方法:

解题思路转载自:http://www.cnblogs.com/jiangjing/archive/2013/05/28/3103336.html

分析:求a^1+..a^n这是矩阵乘法中关于等比矩阵的求法:

|A  E|

|0  E|

当中的A为m阶矩阵。E是单位矩阵,0是零矩阵。而我们要求的是:

A^1+A^2+..A^L。由等比矩阵的性质

|A  ,  1|                 |A^n , 1+A^1+A^2+....+A^(n-1)|

|0  ,  1| 的n次方等于|0     ,                   1                   |

所以我们仅仅须要将A矩阵扩大四倍,变成如上形式的矩阵B。然后开L+1次方就能够得到1+A^1+A^2+....+A^L。

因为多了一个1。所以最后得到的答案我们还要减去1。

同理我们把矩阵A变成B:

|A  E|

|0  E|

然后我们就是求B的n+1次幂之后得到的矩阵为|x1   x2|

|x3   x4|

右上角的矩阵x2减去单位矩阵E,得到就是要求的矩阵了。

#include <iostream>
#include <string.h>
using namespace std;
const int maxn=62;
int n,k,mod; struct mat
{
int arr[maxn][maxn];
mat()
{
memset(arr,0,sizeof(arr));
}
}; mat mul(mat a,mat b)
{
mat ans;
for(int i=0;i<n;i++)
for(int k=0;k<n;k++)
{
if(a.arr[i][k])
for(int j=0;j<n;j++)
{
ans.arr[i][j]+=a.arr[i][k]*b.arr[k][j];
if(ans.arr[i][j]>=mod)
ans.arr[i][j]%=mod;
}
}
return ans;
} mat power(mat p,int k)
{
if(k==1) return p;
mat e;
for(int i=0;i<n;i++)
e.arr[i][i]=1;
if(k==0) return e;
while(k)
{
if(k&1)
e=mul(e,p);
p=mul(p,p);
k>>=1;
}
return e;
} void output(mat ans)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j)
{
ans.arr[i][j+n]--;
while(ans.arr[i][j+n]<0)
ans.arr[i][j+n]+=mod;
}
if(j==n-1)
cout<<ans.arr[i][j+n]<<endl;
else
cout<<ans.arr[i][j+n]<<" ";
}
} int main()
{
while(cin>>n>>k>>mod)
{
mat ori,ans;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>ori.arr[i][j];
if(i==j)
{
ori.arr[i][j+n]=1;
ori.arr[i+n][j+n]=1;
}
}
n*=2;
ans=power(ori,k+1);
n/=2;
output(ans);
}
return 0;
}

[ACM] POJ 3233 Matrix Power Series (求矩阵A+A^2+A^3...+A^k,二分求和或者矩阵转化)的更多相关文章

  1. 矩阵十点【两】 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的迹(就是主对角线上各项的 ...

  2. POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】

    任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K To ...

  3. POJ 3233 Matrix Power Series (矩阵乘法)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 11954   Accepted:  ...

  4. Poj 3233 Matrix Power Series(矩阵乘法)

    Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Description Given a n × n matrix A and ...

  5. poj 3233 Matrix Power Series(矩阵二分,高速幂)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 15739   Accepted:  ...

  6. POJ 3233 Matrix Power Series(矩阵快速幂)

    Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 19338 Accepted: 8161 ...

  7. 线性代数(矩阵乘法):POJ 3233 Matrix Power Series

    Matrix Power Series   Description Given a n × n matrix A and a positive integer k, find the sum S = ...

  8. POJ 3233 Matrix Power Series(二分等比求和)

    Matrix Power Series [题目链接]Matrix Power Series [题目类型]二分等比求和 &题解: 这题我原来用vector写的,总是超时,不知道为什么,之后就改用 ...

  9. POJ 3233 Matrix Power Series(矩阵高速功率+二分法)

    职务地址:POJ 3233 题目大意:给定矩阵A,求A + A^2 + A^3 + - + A^k的结果(两个矩阵相加就是相应位置分别相加).输出的数据mod m. k<=10^9.     这 ...

随机推荐

  1. HDU 1043 & POJ 1077 Eight(康托展开+BFS | IDA*)

    Eight Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30176   Accepted: 13119   Special ...

  2. HDU 5884 Sort(二分答案+计算WPL的技巧)

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. BZOJ2123 [Sdoi2013]森林 【主席树 + 启发式合并】

    题目 输入格式 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负 ...

  4. 《插件》一个比较好用的 chrome浏览器的json格式化插件

    插件名: JSON-Handle   下载地址:         http://jsonhandle.sinaapp.com/ 插件下载后,在浏览器输入:chrome://extensions/ 将下 ...

  5. 【12】vue-router 之路由重定向

    看之前的项目,突然发现一个不算bug的bug,之前也是一直没有想到,现在发现之后越来越觉得有必要改掉, 项目用的是vue做的,自然切换用的就是路由,一级路由包括:首页.记录和个人中心,二级路由是在记录 ...

  6. float 及 overflow 的理解

    1.CSS 盒子模型: 2.float 支持属性:left right none inherit(部分支持) (1)float 属性影响范围:对紧随其后的块儿级元素起作用. (2)清除浮动常用方法:在 ...

  7. Java-01背包问题-动态规划-递归和非递归实现

    国际惯例,先上代码,粗略分析: package com.bag; /** * Author: lihao * Date:2017/8/31 * Description: */ public class ...

  8. 【CF1043D】Mysterious Crime(贡献)

    题意:给定m个人,每个人有n个数字且每个人的所有数字都是一个n的排列,求有多少种方案去掉某个前缀和后缀后m个人剩余的部分相等 m<=10,n<=1e5 思路:考虑极长的一段连续匹配的串,因 ...

  9. RSTP介绍

    1. 介绍 RSTP(Rapid Spanning Tree Protocol),快速生成树协议,标准为802.1w(已合入802.1D-2004)RSTP是对STP技术的修改和补充,最大特点就是快速 ...

  10. hdu 4985(模拟)

    Little Pony and Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...