题意:给你矩阵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. IOC技术在前端项目中的应用

    目录 背景 什么是IOC 如何实现一个IOC 第一步:实现一个容器 第二步:用好装饰器 第三步:使用容器 扩展和展望 最后 背景 前端发展至今已经过去30余年,前端应用领域在不断壮大的过程中,也变得越 ...

  2. 微信小程序代码上传,审核发布小程序

    1.打开微信开发者工具 管理员扫码 -> 填写好小程序的项目目录.AppID(必须是客户已注册好的AppID).项目名称 2.在app.js中修改id(客户登录后台管理系统的id),app.js ...

  3. python元组 列表 (取值、替换、插入、添加、删除)

    1.元组 列表 字典 元组( 元组是不可变的) hello = (1,2,3,4,5) type(hello)

  4. 从零搭建一个IdentityServer——集成Asp.net core Identity

    前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一个基础的验证服务器,并实现了基于客户端证书的Oauth2.0授权流程,以及通过access token访问被保护 ...

  5. 前端面试之JavaScript中this的指向【待完善!】

    JavaScript中this的指向问题! 另一个特殊的对象是 this,它在标准函数和箭头函数中有不同的行为. 在标准函数中, this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为 t ...

  6. 提取当前文件夹下的所有文件名.bat(Windows批处理文件)

    @echo off dir /s/b *.* > 文件名.txt exit

  7. Jmeter非GUI界面对阿里云服务器压测

    一.Jmeter非GUI界面 参数讲解 讲解:非GUI界面,压测参数讲解             -h 帮助            -n 非GUI模式            -t 指定要运行的 JMe ...

  8. vue的nuxt框架中使用vue-video-player

    一.基本需求:使用nuxt框架,需要在移动端网页中播放视频.  二.文中解决的基本问题:      1.vue-video-player在nuxt中怎么使用.      2.由于为了适配移动端,使用了 ...

  9. idea maven package报错"不再支持源选项 5 请使用 6 或更高版本。不支持发行版本 5"

    解决办法: 1.确保java compile以及project和module的java字节码版本是所用的java版本:

  10. wmi_exporter+Prometheus+Grafana

    wmi_exporter+Prometheus+Grafana 原文地址: CSDN:NRlovestudy:Windows 下搭建 wmi_exporter+Prometheus+Grafana 服 ...