题意:给你矩阵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 构造子矩阵+矩阵快速幂的更多相关文章

  1. 【构造共轭函数+矩阵快速幂】HDU 4565 So Easy! (2013 长沙赛区邀请赛)

    [解题思路] 给一张神图,推理写的灰常明白了,关键是构造共轭函数,这一点实在是要有数学知识的理论基础,推出了递推式,接下来就是矩阵的快速幂了. 神图: 给个大神的链接:构造类斐波那契数列的矩阵快速幂 ...

  2. poj3070 单位矩阵(转移矩阵构造)+矩阵快速幂

    太妙了..通过矩阵乘法来加速递推 #include<iostream> #include<cstring> #include<cstdio> using names ...

  3. hdu 2256 Problem of Precision 构造整数 + 矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=2256 题意:给定 n    求解   ? 思路: , 令  , 那么 , 得: 得转移矩阵: 但是上面求出来的并 ...

  4. hdu4686 Arc of Dream ——构造矩阵+快速幂

    link: http://acm.hdu.edu.cn/showproblem.php?pid=4686 构造出来的矩阵是这样的:根据题目的ai * bi = ……,可以发现 矩阵1 * 矩阵3 = ...

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

    题目要求的是 A+A2+...+Ak,而不是单个矩阵的幂. 那么可以构造一个分块的辅助矩阵 S,其中 A 为原矩阵,E 为单位矩阵,O 为0矩阵    将 S 取幂,会发现一个特性: Sk +1右上角 ...

  6. poj3233(矩阵快速幂的和)

    题目链接:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K T ...

  7. HDU1757-A Simple Math Problem,矩阵快速幂,构造矩阵水过

    A Simple Math Problem 一个矩阵快速幂水题,关键在于如何构造矩阵.做过一些很裸的矩阵快速幂,比如斐波那契的变形,这个题就类似那种构造.比赛的时候手残把矩阵相乘的一个j写成了i,调试 ...

  8. BZOJ 3240 构造矩阵+矩阵快速幂

    思路: ax+b cx+d 构造矩阵+矩阵快速幂 (需要加各种特判,,,,我好像加少了- ) //By SiriusRen #include <cstdio> #include <c ...

  9. 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )

    题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...

随机推荐

  1. 记录list.remove()和list.pop()

    list.remove(obj):这个是移除列表中某个值的第一个匹配项 list.pop(index):这个是移除列表中下标为index的元素 当元素全是数字或者有数字时注意区分.

  2. Python+Selenium+Unittest实现PO模式web自动化框架(1)

    1.什么是PO模式? PO是Page Object的缩写 PO模式是自动化测试项目开发实践的最佳设计模式之一,讲页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,从而提供可维护性. 主要有以下 ...

  3. 找不到:DarchetypeCatalog=local

    设置IDEA Maven->Runner 界面的VM Options参数值为-DarchetypeCatalog=local 刷新项目Maven配置,在项目右边界面,重新引入Maven

  4. 解决window10 和 ubuntu 双系统安装没有启动选项问题

    win10 和Ubuntu 双系统安装在网上已经有很多例子了,这里就不在赘述了. 今天新买的笔记本,想安装双系统.正常安装完ubuntu 重启后没有选项. 解决方法一 下载和解压以后,按照以下的步骤安 ...

  5. 接口新建学习---cookie策略

    一.为什么要添加cookie? 模拟浏览器,因为http是无状态协议,像览器一样的存储和发送Cookie,如果发送一个http请求他的响应中包含Cookie,那么Cookie Manager就会自动地 ...

  6. 网络优化之net.ipv4.tcp_tw_recycle和tcp_tw_reuse参数

    网络优化之net.ipv4.tcp_tw_recycle和tcp_tw_reuse参数 - 一个人默默潜行 - 博客园 https://www.cnblogs.com/ppp1314520818/p/ ...

  7. __new__() to create it, and __init__() to customize it 类方法 实例方法

    https://docs.python.org/3/reference/datamodel.html#object.__init__

  8. (Oracle)看懂Oracle执行计划(转载)

    最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing- 一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问 ...

  9. python3编码转换

    str->bytes:encode编码 bytes->str:decode解码 字符串通过编码成为字节码,字节码通过解码成为字符串. >>> text = '我是文本' ...

  10. JPEG解码——(3)文件头解析

    与具体的编码数据空间相比,jpeg文件头占据非常小乃至可以忽略不计的大小. 仍然拿JPEG解码--(1)JPEG文件格式概览中的<animal park>这张图片来举例,从跳过SOS(FF ...