POJ 3233 Matrix Power Series 矩阵快速幂 + 二分
题意:求矩阵的次方和
解题思路:最容易想到方法就是两次二分因为 我们可以把一段 A^1 + A^2 + .......A^K 变成 A^1 + ..A^(K/2) +( A^1 + ..A^(K/2))*(A^(k/2)) 当k 为奇数的时候 或者 A^1 + ..A^(K/2) +( A^1 + ..A^(K/2))*(A^(k/2)) + A^K 当K 为偶数的时候。
解题代码:
1 // File Name: temp.cpp 2 // Author: darkdream 3 // Created Time: 2014年09月17日 星期三 11时35分45秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 using namespace std; 26 int n ,m , k ; 27 int ta,tb; 28 struct Matrix 29 { 30 int mat[30][30]; 31 void clear() 32 { 33 memset(mat,0,sizeof(mat)); 34 } 35 void output() 36 { 37 for(int i =0 ;i < n ;i ++) 38 { 39 for(int j = 0 ;j < n ;j ++) 40 printf("%d ",mat[i][j]); 41 printf("\n"); 42 } 43 } 44 void init() 45 { 46 clear(); 47 for(int i = 0 ;i < n;i ++) 48 for(int j = 0 ;j < n;j ++) 49 { 50 scanf("%d",&mat[i][j]); 51 } 52 } 53 Matrix operator *(const Matrix &b) const 54 { 55 Matrix ret; 56 ret.clear(); 57 for(int i = 0 ;i < n ;i ++) 58 for(int j = 0;j < n;j ++) 59 { 60 for(int s = 0 ;s < n ;s ++) 61 { 62 ret.mat[i][j] =(ret.mat[i][j] + mat[i][s] * b.mat[s][j]) % m ; // 第I 行 第J 列 63 } 64 } 65 return ret; 66 } 67 Matrix operator *(const int &b) const 68 { 69 Matrix ret; 70 ret.clear(); 71 for(int i = 0 ;i < n ;i ++) 72 for(int j = 0;j < n;j ++) 73 { 74 ret.mat[i][j] = (mat[i][j] * b) % m ; // 第I 行 第J 列 75 } 76 return ret; 77 } 78 Matrix operator +(const Matrix &b) const 79 { 80 Matrix ret; 81 ret.clear(); 82 for(int i = 0 ;i < n ;i ++) 83 for(int j = 0;j < n;j ++) 84 { 85 ret.mat[i][j] = (mat[i][j] + b.mat[i][j]) % m ; // 第I 行 第J 列 86 } 87 return ret; 88 } 89 }; 90 Matrix Pow( Matrix a ,LL t ) 91 { 92 Matrix ret; 93 ret.clear(); 94 for(int i = 0 ;i < n ;i ++) 95 ret.mat[i][i] = 1; 96 Matrix tmp = a; 97 while(t) 98 { 99 if(t&1) ret = ret * tmp; 100 tmp = tmp * tmp; 101 t >>=1; 102 } 103 return ret; 104 } 105 Matrix add(Matrix a, int k ) 106 { 107 Matrix ans; 108 ans.clear(); 109 if(k == 1) 110 { 111 return a; 112 } 113 if(k&1) 114 { 115 Matrix temp = add(a,k/2); 116 ans = temp + temp * Pow(a,k/2) + Pow(a,k); 117 }else{ 118 Matrix temp = add(a,k/2); 119 ans = temp + temp * Pow(a,k/2); 120 } 121 return ans ; 122 } 123 int main(){ 124 LL l ; 125 while(scanf("%d %d %d",&n,&k,&m) != EOF) 126 { 127 Matrix a; 128 a.clear(); 129 a.init(); 130 a = add(a,k); 131 //a.output(); 132 a.output(); 133 } 134 return 0; 135 }
View Code
写完以后过了竟然跑了 1300+ms 最快 0ms 不能忍上网查题解 发现了这种方法 :http://www.cnblogs.com/rainydays/archive/2011/02/21/1960189.html
他的主要思想是多加 n维度 构成一个能累加的矩阵 ,具体看博主题解。
这种思想很巧妙。
转载于:https://www.cnblogs.com/zyue/p/3979014.html
POJ 3233 Matrix Power Series 矩阵快速幂 + 二分相关推荐
- Matrix Power Series(矩阵快速幂,二分法/构造矩阵套矩阵)
传送门 题意: 思路: 方法一:(二分) 分析: 奇偶分类讨论: 1.代码: #include <iostream> #include <cstdio> #include &l ...
- POJ 3233 Matrix Power Series (矩阵分块,递推)
矩阵乘法是可以分块的,而且幂的和也是具有线性的. 不难得到 Si = Si-1+A*Ai-1,Ai = A*Ai-1.然后矩阵快速幂就可以了. /*************************** ...
- poj 3233 Matrix Power Series
Matrix Power Series 思路 题意比较简单,就是要求S(n)=∑i=1nAiS(n) = \sum _{i = 1} ^{n} A^ {i}S(n)=∑i=1nAi,显然有S(n)= ...
- poj 3233 Matrix Power Series
最近一直在做矩阵的题目,这算是一道简单题目吧. 建立一个矩阵的结构体,便于赋值和返回值. S = A + A2 + A3 + - + Ak 如果 S=A+A2 + A3 +A4 S= (A + A ...
- POJ 3233 Matrix Power Serie (矩阵快速幂)
Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. ...
- poj 3323 Matrix Power Series (矩阵乘法 非递归形式)
为了搞自动机+矩阵的题目,特来学习矩阵快速幂..........非递归形式的求Sum(A+A^2+...+A^k)不是很懂,继续弄懂................不过代码简洁明了很多,亮神很给力 # ...
- POJ 3233 Matrix Power Serie
题意:给一个n×n的矩阵A,求S = A + A2 + A3 + - + Ak. 解法:从式子中可得递推式S(n) = S(n - 1) + An,An = An-1×A,可得矩阵递推式 [S(n), ...
- poj - problem 3070 Fibonacci 【矩阵 +快速幂】
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13732 Accepted: 9728 Descri ...
- poj3233(矩阵快速幂的和)
题目链接:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K T ...
最新文章
- 细鹏系列裸金属服务器多核算力,鲲鹏凌云,开启多元计算新架构_外发版(40页)-原创力文档...
- python 加速循环的执行_python循环怎么用多线程去运行
- linux内核打开prntk,操作系统实验一向Linux内核增加一个系统调用.docx
- PAT甲级1050 String Subtraction:[C++题解]字符串作差
- MFC中GetDlgItemInt()方法的疑惑与使用总结
- Git 教程学习--第三篇
- java读取同包文件_Java实现从jar包中读取指定文件的方法
- 人工智能-机器学习之seaborn(读取xlsx文件,小提琴图)
- WEB前端开发快速入门教程
- python识别车辆图片_opencv+python车辆识别
- C# .net实现发送手机短信功能
- 电子知识基础——电阻
- windows无法上网:代理服务器出现问题或地址有误
- 编译项目时报出已经定义了构造器
- 项目经理在团队不同阶段的领导风格
- 是面试官放水,还是公司太缺人?这都没挂,kotlin常用语法
- IcoFX v3.6.0 ICO图标制作工具中文便携版
- 如何解决Winfrom加载程序未能加载文件或程序集,抛出异常,
- 数商云SCM系统订单收货场景介绍,探索采购新模式,提升汽车服务企业运营水平
- 样本协差阵 matlab函数,方差var、协方差cov、协方差矩阵(浅谈)(三)_函数cov...
热门文章
- 武汉数字工程研究所计算机软件分数,武汉数字工程研究所2017考研成绩查询时间:2月16日...
- C++ cin.sync()和cin.ignore()
- okex java sdk_OKEX官网新手使用教程
- python中matplotlib画图_Python-matplotlib画图(莫烦笔记)
- python高阶函数闭包装饰器_5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器...
- LOAD DATA INFILE 语法
- java懒加载设计模式_java设计模式——单例模式
- asp获取mysql数据报错_ASP.NET在删除掉数据库文件后报错处理
- 使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法
- skywalking使用方法_skywalking 6.2配置相关和使用