C++题解:Matrix Power Series ——矩阵套矩阵的矩阵加速
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 ——矩阵套矩阵的矩阵加速的更多相关文章
- Poj 3233 Matrix Power Series(矩阵乘法)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Description Given a n × n matrix A and ...
- 矩阵十点【两】 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 (矩阵乘法)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 11954 Accepted: ...
- 构造矩阵解决这个问题 【nyoj299 Matrix Power Series】
矩阵的又一个新使用方法,构造矩阵进行高速幂. 比方拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s. ...
- POJ 3233 Matrix Power Series(矩阵快速幂)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 19338 Accepted: 8161 ...
- POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】
任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K To ...
- [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 Total Submissions: 15739 Accepted: ...
- [POJ3233]Matrix Power Series 分治+矩阵
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [POJ3233]Matrix Power Series 分治+矩阵 题目大意 A为n×n(n<= ...
随机推荐
- Servlet学习记录2
读取web.xml参数 上篇文章ImageServlet里只设置了JPG,GIF,DOC类型文件的Content-Type.如果这时候需求变化了,需要增加Excel文件格式的Content-Type, ...
- fiddler抓https包
若手机端安装证书后还是无法抓取到https请求,请注意手机端证书开关是否开启: eg:ios 设置---通用---关于本机---证书信任设置:开启证书信任 若还是无法抓包,则可以进行一下操作: 给fi ...
- Serializer fields
1.导入 from rest_framework import serializers field参数 1.read_only read_only=True 表示不允许用户自己上传,只能用于api的输 ...
- Build Tool/Maven, Gradle
一.Build Tool 1.什么是Build Tool build tool是可以自动由源代码创建可执行的应用程序的程序. Building 包括编译.链接和打包代码成一个可用的或可执行形式. 在小 ...
- 服务器端AJAX的Servlet代码实现
package com.itheima.servlet; import java.io.IOException; import javax.servlet.ServletException; impo ...
- Django最简单的从请求过程
1,url匹配,匹配路由,由理由分发器(urls.py)查找用户请求的url对应关系 1,找到业务函数就调用(views.py中的方法) 2,找不到就报404错误, 3,将数据返回给浏览器 ...
- CP IPS功能测试
测试环境:CP 15000硬件 测试拓扑: Step1:重新安装Check_Point_R80.10_T479_Gaia并且打补丁 Step2:初始化CP并且部署模式为Management和Gatew ...
- js给页面添加回车监测事件,实现回车登录功能
document.body.addEventListener('keyup', function (e) { ') { $("#btn_login").click(); } }) ...
- The declared package does not match the expected package Java
今天使用vscode 编写java代码做测试时候,发现这个问题,大概总结一下. 目录结构 bao -> Point.java test.java package bao; public clas ...
- Java反射基础知识
反射机制就是可以把一个类,类的成员(属性.方法)当成一个对象来操作,也就是说,类,类的成员,我们在运行的时候可以动态的去操作它们. 所有的Java类都继承了Object类,在Object类中定义了一个 ...