Matrix Power Series

r时间限制: 1 Sec 内存限制: 512 MB

题目描述

给定矩阵A,求矩阵S=A1+A2+……+A^k,输出矩阵,S矩阵中每个元都要模m。

数据范围: n (n ≤ 30) , k (k ≤ 109) ,m (m < 104)

输入

输入三个正整数n,k,m

输出

输出矩阵S mod m

样例输入

2 2 4

0 1

1 1

样例输出

1 2

2 3

这道题不多说,可以得出加速矩阵(E为单位矩阵,也就是形为\(\begin{bmatrix}1&0&...&0\\0&1&...&0\\... &...&...&...\\0&0& ...&1\end{bmatrix}\)的矩阵,任何矩阵乘以这个单位矩阵还是原矩阵):

\(\begin{bmatrix}
A &E \\
0 & E
\end{bmatrix}\)*\(\begin{bmatrix} A &E \\ 0 & E \end{bmatrix}\)=\(\begin{bmatrix} A^{2} &E+A \\ 0 & E \end{bmatrix}\)

所以根据题目的要求,答案便是\(\begin{bmatrix}
A &E \\
0 & E
\end{bmatrix}^{k+1}\)的(1,2)

主要难点是矩阵套矩阵,详见代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; #define N 35
#define P 5
#define LL long long LL fuck,k,mod; struct M {
int n,m,c[N][N];
M() {
n=m=fuck;
memset(c,0,sizeof(c));
}
M operator * (const M& a) {
M r;
r.n=n;r.m=a.m;
for(int i=1;i<=r.n;i++)
for(int j=1;j<=r.m;j++)
for(int k=1;k<=m;k++)
r.c[i][j]= ( r.c[i][j] + (c[i][k] * a.c[k][j] ) % mod) % mod;
return r;
}
M operator + (const M& a) {
M r;
for(int i=1;i<=r.n;i++)
for(int j=1;j<=r.m;j++)
r.c[i][j]=(c[i][j]+a.c[i][j]) %mod;
return r;
}
M operator - (const M& a) {
M r;
for(int i=1;i<=r.n;i++)
for(int j=1;j<=r.m;j++)
r.c[i][j]=r.c[i][j]+(mod+c[i][j]-a.c[i][j]) %mod;
return r;
}
void _read() {
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lld",&c[i][j]);
}
void pre() {
n=m=fuck;
for(int i=1;i<=fuck;i++)
c[i][i]=1;
}
void _print() {
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(j!=1) cout<<" ";
cout<<c[i][j];
}
if(i!=n) puts("");
}
puts("");
}
}fuckk; struct Matrix {
LL n,m;
M c[P][P];
Matrix() {
m=2,n=2;
memset(c,0,sizeof(c));
};
Matrix operator * (const Matrix& a) {
Matrix r;
r.n=n;r.m=a.m;
for(int i=1;i<=r.n;i++)
for(int j=1;j<=r.m;j++)
for(int k=1;k<=m;k++)
r.c[i][j]=r.c[i][j] + (c[i][k] * a.c[k][j] );
return r;
} Matrix pow(Matrix a, LL indexx) {
Matrix sum;sum.n=sum.m=2;
sum.c[1][1].pre();
sum.c[2][2].pre();
//a.c[1][2]._print();
while(indexx>0) {
if(indexx&1) sum=sum*a;
/*sum.c[1][1]._print();
sum.c[1][2]._print();
sum.c[2][1]._print();
sum.c[2][2]._print();*/
a=a*a;
//a.c[1][1]._print();
indexx/=2;
}
return sum;
}
void sub() {
c[1][2]=c[1][2]-fuckk;
} }ans; int main() {
cin>>fuck>>k>>mod;
M a,b;
a._read();
b.pre();
fuckk=b;
ans.c[1][1]=a;
ans.c[1][2]=ans.c[2][2]=b;
//ans.test(ans);
ans=ans.pow(ans,k+1);
//ans.c[1][2]._print();
ans.sub();
ans.c[1][2]._print();
}

C++题解:Matrix Power Series ——矩阵套矩阵的矩阵加速的更多相关文章

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

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

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

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

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

  4. 构造矩阵解决这个问题 【nyoj299 Matrix Power Series】

    矩阵的又一个新使用方法,构造矩阵进行高速幂. 比方拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s. ...

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

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

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

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

  7. [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:  ...

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

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

  9. [POJ3233]Matrix Power Series 分治+矩阵

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [POJ3233]Matrix Power Series 分治+矩阵 题目大意 A为n×n(n<= ...

随机推荐

  1. <mvc:resources mapping="/xxx/**" location="/xxx/"/>无效,可能和Controller的URL模式有关

    某项目webapp下有子目录res,其中有img.css.js等存放静态资源的文件夹. 在定义了dispacher-servlet的<url-pattern>/</url-patte ...

  2. Servlet学习记录3

    提交表单信息 Web程序的任务是实现服务器与客户端浏览器之间的信息交互.客户端提交的信息可能来自表单里的文本框,密码框,选择框,单选按钮,复选框以及文件域.这些表单信息被以参数形式提交到了服务器.Se ...

  3. matplotlib.mlab库的重要函数

    连接地址 matplotlib.mlab¶ 与 MATLAB兼容的函数 MATLAB compatible functions¶ cohere() Coherence (normalized cros ...

  4. react项目如何修改默认3000端口号

    在运行react项目时,经常会遇到默认的3000端口被占用的情况,此时不想查找哪个程序占用了3000端口,想使用其他端口继续运行. 打开项目中的node_modules文件夹,找到react_scri ...

  5. 修复Microsoft Store 无法连接网络 代码: 0x80072EFD

    事情的经过是这样的,我的Windows版本是1709,前两天刚从1703升上来,今天突然发现它自己给我装了个skype,我上Microsoft商店里查一下是什么情况,结果突然发现它又双双双不正常工作了 ...

  6. ruby在index页面显示货币符号

    1.显示人民币符号 <td><%= number_to_currency product.price, unit: "¥" %></td> 2. ...

  7. Bootstrap中的data-toggle,data-target

    data-toggle指以什么事件触发常用的如collapse,modal,popover,tooltips等:data-target指事件的目标, 一起使用就是代表data-target所指的元素以 ...

  8. hadoop常见问题

    Q1.什么是 Hadoop? Hadoop 是一个开源软件框架,用于存储大量数据,并发处理/查询在具有多个商用硬件(即低成本硬件)节点的集群上的那些数据.总之,Hadoop 包括以下内容: HDFS( ...

  9. Python对象迭代与反迭代相关问题与解决技巧

      1.如何实现可迭代对象和迭代器对象(1)¶ In [1]: # 列表和字符串都是可迭代对象 l = [1,2,3,4] In [2]: s = 'abcde' In [3]: for x in l ...

  10. TreeView的三种状态,全选,全不选,半选中

    我知道的设置treeview节点的三种状态,如果不是买的控件,那么通过代码,只能设置两种状态,我知道的有三种方法, 第一种是重写treeview,第二种是把三种状态做成小图标,让节点复选框随着不同的状 ...