POJ3233 构造子矩阵+矩阵快速幂
题意:给你矩阵A,求S=A+A^1+A^2+...+A^n
sol:直接把每一项解出来显然是不行的,也没必要。
我们可以YY一个矩阵:

其中1表示单位矩阵
然后容易得到:

可以看出这个分块矩阵的左下角那块就可以得到要求的解S
我们取这一块,再减去一个单位矩阵1即可。
为了保持右下角一直是1,所以右上的位置必须是0,由于需要不断移位,所以1是必要的,A是必要的,所以第一列保证移位,
第二列保证保留1,因此我们能成功构造出....
这个题还可以根据等比矩阵的性质来进行求解...后面补(x
1 #include <iostream>
2 #include <stdio.h>
3 #include <cstring>
4 using namespace std;
5
6 int n,k,mod;
7 typedef long long ll;
8 struct matrix{
9 int row,col,ele[32][32];
10 matrix(){};
11 matrix(int row,int col):row(row),col(col){
12 memset(ele,0,sizeof(ele));
13 }
14 void init(){
15 row=col=n;memset(ele,0,sizeof(ele));
16 for(int i=0;i<n;++i) ele[i][i]=1;
17 }
18 void clear(){
19 row=col=n;
20 memset(ele,0,sizeof(ele));
21 }
22 matrix operator *(const matrix& rhs){
23 if(col!=rhs.row) printf("Exception...\n");
24 matrix c=matrix(row,rhs.col);
25 for(int i=0;i<row;i++)
26 for(int k=0;k<col;++k)
27 for(int j=0;j<rhs.col;++j)
28 c.ele[i][j]=(c.ele[i][j]+ele[i][k]*rhs.ele[k][j])%mod;
29 return c;
30 }
31 matrix operator +(const matrix &rhs){
32 if(row!=rhs.row||col!=rhs.col) printf("+ Exception\n");
33 matrix c=matrix(row,col);
34 for(int i=0;i<row;++i)
35 for(int j=0;j<col;++j)
36 c.ele[i][j]=(c.ele[i][j]+ele[i][j]+rhs.ele[i][j])%mod;
37 return c;
38 }
39 void print(){
40 for(int i=0;i<row;++i){
41 for(int j=0;j<col;++j)
42 printf("%d ",ele[i][j]);
43 printf("\n");
44 }
45 }
46 };
47 struct bigMatrix{
48 int row,col;matrix ele[5][5];
49 bigMatrix(){};
50 bigMatrix(int row,int col):row(row),col(col){
51 for(int i=0;i<row;++i)
52 for(int j=0;j<col;++j) ele[i][j].clear();
53 }
54 void init(){
55 row=col=2;
56 for(int i=0;i<row;++i)
57 for(int j=0;j<col;++j) ele[i][j].clear();
58 for(int i=0;i<row;++i) ele[i][i].init();
59 }
60 bigMatrix operator *(const bigMatrix& rhs){
61 if(col!=rhs.row) printf("Exception...\n");
62 bigMatrix c=bigMatrix(row,rhs.col);
63 for(int i=0;i<row;i++)
64 for(int k=0;k<col;++k)
65 for(int j=0;j<rhs.col;++j)
66 c.ele[i][j]=(c.ele[i][j]+ele[i][k]*rhs.ele[k][j]);
67 return c;
68 }
69 };
70 bigMatrix fastpow(bigMatrix a,ll b){
71 bigMatrix ans;ans.init();
72 // printf("%d %d %d %d\n",a.row,a.col,ans.row,ans.col);
73 if(b==0) return ans;
74 while(b){
75 if(b&1) ans=ans*a;
76 a=a*a;
77 b>>=1;
78 }
79 return ans;
80 }
81 int main(){
82 while(~scanf("%d%d%d",&n,&k,&mod)){
83 matrix A=matrix(n,n);
84 for(int i=0;i<n;++i){
85 for(int j=0;j<n;++j){
86 scanf("%d",&A.ele[i][j]);
87 A.ele[i][j]%=mod;
88 }
89 }
90 bigMatrix mat=bigMatrix(2,2);
91 matrix t=matrix(n,n);t.init();
92 mat.ele[0][0]=A;mat.ele[0][1]=matrix(n,n);
93 mat.ele[1][0]=t;mat.ele[1][1]=t;
94 bigMatrix d=fastpow(mat,k+1);
95 matrix B=d.ele[1][0];
96 for(int i=0;i<n;++i) B.ele[i][i]=(B.ele[i][i]-1+mod)%mod;
97 for(int i=0;i<n;++i){
98 printf("%d",B.ele[i][0]);
99 for(int j=1;j<n;++j){
100 printf(" %d",B.ele[i][j]);
101 }
102 printf("\n");
103 }
104 }
105 return 0;
106 }
POJ3233 构造子矩阵+矩阵快速幂的更多相关文章
- 【构造共轭函数+矩阵快速幂】HDU 4565 So Easy! (2013 长沙赛区邀请赛)
[解题思路] 给一张神图,推理写的灰常明白了,关键是构造共轭函数,这一点实在是要有数学知识的理论基础,推出了递推式,接下来就是矩阵的快速幂了. 神图: 给个大神的链接:构造类斐波那契数列的矩阵快速幂 ...
- poj3070 单位矩阵(转移矩阵构造)+矩阵快速幂
太妙了..通过矩阵乘法来加速递推 #include<iostream> #include<cstring> #include<cstdio> using names ...
- hdu 2256 Problem of Precision 构造整数 + 矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=2256 题意:给定 n 求解 ? 思路: , 令 , 那么 , 得: 得转移矩阵: 但是上面求出来的并 ...
- hdu4686 Arc of Dream ——构造矩阵+快速幂
link: http://acm.hdu.edu.cn/showproblem.php?pid=4686 构造出来的矩阵是这样的:根据题目的ai * bi = ……,可以发现 矩阵1 * 矩阵3 = ...
- poj3233 Matrix Power Series(矩阵快速幂)
题目要求的是 A+A2+...+Ak,而不是单个矩阵的幂. 那么可以构造一个分块的辅助矩阵 S,其中 A 为原矩阵,E 为单位矩阵,O 为0矩阵 将 S 取幂,会发现一个特性: Sk +1右上角 ...
- poj3233(矩阵快速幂的和)
题目链接:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K T ...
- HDU1757-A Simple Math Problem,矩阵快速幂,构造矩阵水过
A Simple Math Problem 一个矩阵快速幂水题,关键在于如何构造矩阵.做过一些很裸的矩阵快速幂,比如斐波那契的变形,这个题就类似那种构造.比赛的时候手残把矩阵相乘的一个j写成了i,调试 ...
- BZOJ 3240 构造矩阵+矩阵快速幂
思路: ax+b cx+d 构造矩阵+矩阵快速幂 (需要加各种特判,,,,我好像加少了- ) //By SiriusRen #include <cstdio> #include <c ...
- 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )
题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...
随机推荐
- Maven + springboot + mybatis 构建多模块工程
废话不说先上最终效果:创建一个空项目,再创建一个父项目用来管理各模块并维护各模块关系,简要说明如下: parent模块:主要用来管理以下各模块,和各模块涉及的jar包版本和boot项目入口级的的依赖管 ...
- 前端PDF文件转图片方法
第一步:先下载pdfjs,网址:PDF下载地址,再引入到项目中,我是标签直接引用的 <script src="pdfjs/build/pdf.js"></scri ...
- ES入门及安装软件
es介绍 Elasticsearch,简称es,是一款高扩展的分布式全文检索引擎.它可以近乎实时的存储,检索数据.es是面向文档型的数据库,一条数据就是一个文档,用json做为文档序列化的格式.es是 ...
- Jaspersoft Studio报表设计
1 开发工具 1.1 软件名称 名称:TIBCO Jaspersoft Studio 版本:6.0或以上,建议6.2.1 1.2 软件安装 免安装软件包,拷贝即可使用,建议放在D:盘或其 ...
- python基础(int,str,bool,list)
1数字int. 数字主要是用于计算用的,使用方法并不是很多,就记住一种就可以: bit_length() #bit_length() 当十进制用二进制表示时,最少使用的位数 v = 11 1 ...
- LOJ10144宠物收养所
HNOI 2004 最近,阿 Q 开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,阿 Q 根据领养者的要求通过他自己发明的 ...
- Eslint错误提示
"Missing semicolon." : "缺少分号.","Use the function form of \"use strict\ ...
- JavaWeb——JSP,JSP指令,注释
什么是JSP JSP原理 JSP页面中的java代码服务器是如何执行的 Web服务器在调用jsp时会给jsp提供一些什么java对象 JSP执行过程 JSP页面的元素包括 JSP模版元素 JSP脚本片 ...
- Spark Dataset DataFrame 操作
Spark Dataset DataFrame 操作 相关博文参考 sparksql中dataframe的用法 一.Spark2 Dataset DataFrame空值null,NaN判断和处理 1. ...
- java 将内容写入文件 txt
@Test //将内容写入文件 public void xieru() throws Exception{ FileWriter fileWriter=new FileWriter("d:\ ...