题意:给你矩阵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. 【LinuxShell】cp 用法详解

    Linux cp命令主要用于复制文件或目录. -a:此选项通常在复制目录时使用,它保留链接.文件属性,并复制目录下的所有内容.其作用等于dpR参数组合. -d:复制时保留链接.这里所说的链接相当于Wi ...

  2. loj10157

    太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不 ...

  3. Spring Boot中进行Junit测试

    Spring Boot新版本默认使用Junit5,pom依赖为: <dependency> <groupId>org.springframework.boot</grou ...

  4. Scala-文件操作

    Scala-文件操作 一.遍历一个文件中的每一行 方法一: 使用Source.getLines返回的迭代器 方法二: 将Source.getLines返回的迭代器,转换成数组 方法三: 调用Sourc ...

  5. Linux环境Hive安装配置及使用

    Linux环境Hive安装配置及使用 一.Hive Hive环境前提 二.Hive架构原理解析 三.Hive-1.2.2单机安装流程 (1) 解压apache-hive-1.2.2-bin.tar.g ...

  6. Spark剖析-宽依赖与窄依赖、基于yarn的两种提交模式、sparkcontext原理剖析

    Spark剖析-宽依赖与窄依赖.基于yarn的两种提交模式.sparkcontext原理剖析 一.宽依赖与窄依赖 二.基于yarn的两种提交模式深度剖析 2.1 Standalne-client 2. ...

  7. Go语言学习-main和init

    main 函数和 init 函数Go里面有两个保留的函数: init 函数(能够应用于所有的 package )和 main 函数(只能应用于 package main ).这两个函数在定义时不能有任 ...

  8. python爬虫selenium相关

    首先上很好用的selenium中文文档,基本上所有问题都能通过阅读此文档解决.可惜好像没找到翻译者名称. https://python-selenium-zh.readthedocs.io/zh_CN ...

  9. 深入浅出Java线程池:源码篇

    前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...

  10. Web程序设计基础期末大作业——模仿QQ飞车手游S联赛官网编写的网页

    QQ飞车手游是我非常喜欢的游戏,也是我现在为数不多的常在玩的游戏,刚好我Web程序设计基础的大作业是要做一套网站,我就借此机会模仿飞车S联赛官网的页面自己做了一个网页,又加了一些自己的元素,由于我做这 ...