题意:给你矩阵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. 2021 Duilib最新入门教程(一)Duilib简介

    目录 Duilib解决什么问题? 方案一.自己画界面 方案二.使用标准控件 方案三.使用Duilib框架 Duilib是什么? 先看下Duilib官方简介 再看下DirectUI 百度百科   比起介 ...

  2. RecyclerView 源码分析(二) —— 缓存机制

    在前一篇文章 RecyclerView 源码分析(一) -- 绘制流程解析 介绍了 RecyclerView 的绘制流程,RecyclerView 通过将绘制流程从 View 中抽取出来,放到 Lay ...

  3. 07. struts2中对Action的管理方式

    web.xml配置文件的常用代码 <filter> <filter-name>struts2</filter-name> <filter-class>o ...

  4. 【CentOS7】Apache发布静态网页-超简单

    目前能够提供Web网络服务的程序有 IIS. Nginx和 Apache等.其中,IIS (Internet Information Services,互联网信息服务)是 Windows系统中默认的 ...

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

    1.Common目录下的具体模块讲解. 2.basepage.py basepage.py模块里面是封装的对元素的操作.例如:查找元素.点击元素.文本输入等等. # --^_^-- coding:ut ...

  6. 对于两个输入文件,即文件A 和文件B ,请编写MapReduce程序,对两个文件进行合并排除其中重复的内容,得到一个新的输出文件C。

    package org.apache.hadoop.examples; import java.util.HashMap; import java.io.IOException; import jav ...

  7. 【转载】HTTP 协议详细介绍

    背景 当你在浏览器地址栏敲入"http://www.cnblogs.com/",然后猛按回车,呈现在你面前的,将是博客园的首页了(这真是废话,你会认为这是理所当然的).作为一个开发 ...

  8. Python 2.x 和 Python 3.x

    Python 2.x 默认不支持中文,具体原因,等到介绍 字符编码 时给大家讲解 Python 2.x 的解释器名称是 python Python 3.x 的解释器名称是 python3 目前市场上有 ...

  9. Session.invalidate与sessiont.removeAtribute()学习比较

    当浏览器第一次请求时,服务器创建一个session对象,同时生成一个sessionId,并在此次响应中将sessionId 以响应报文的方式传回客户端浏览器内存或以重写url方式送回客户端,来保持整个 ...

  10. Java面试(解答题一)

    1.简述下列问题 List,set,map的区别 解答:List,Set都是继承自Collection接口,Map则不是: List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素 ...