POJ3233 Matrix Power Series
原题传送:http://poj.org/problem?id=3233
两个二分:二分 k ,二分矩阵。
求Sn = A + A2 + A3 + … + Ak。
首先我们能矩阵二分快速幂计算出Ak,那么我们对S再进行二分:
当k % 2 != 0则计算Ak+S(k-1),当k % 2 == 0时计算S(k/2) * (Ak/2 + E),这样就可以在log(k)的时间里算出Sk。
ps:这题有两个地方要注意,否则可能会TLE
1. 用 unsigned int,不要 long long
2. 取模运算效率很低,矩阵乘法单个元素最大值不是很大的情况下先算出来再取一次模更好。
1 #include <stdio.h> 2 #include <string.h> 3 const int maxn = 31; 4 struct mat 5 { 6 unsigned m[maxn][maxn]; 7 }a, E; 8 unsigned n, k, MOD; 9 10 mat operator *(mat u, mat v) 11 { 12 mat c; 13 memset(c.m, 0, sizeof c.m); 14 for(int i = 0; i < n; i ++) 15 for(int j = 0; j < n; j ++){ 16 for(int r = 0; r < n; r ++) 17 c.m[i][j] += u.m[i][r] * v.m[r][j]; 18 c.m[i][j] %= MOD; 19 } 20 return c; 21 } 22 23 mat operator +(mat u, mat v) 24 { 25 mat c; 26 for(int i = 0; i < n; i ++) 27 for(int j = 0; j < n; j ++) 28 c.m[i][j] = (u.m[i][j] + v.m[i][j]) % MOD; 29 return c; 30 } 31 32 mat cal(mat A, int x) 33 { 34 mat t = E; 35 for(; x; x >>= 1, A = A * A) 36 if(x & 1) t = t * A; 37 return t; 38 } 39 40 mat sum(int x) 41 { 42 if(x == 1) 43 return a; 44 if(x & 1) 45 return cal(a, x) + sum(x - 1); 46 else 47 return sum(x / 2) * (E + cal(a, x / 2)); 48 return a; 49 } 50 int main() 51 { 52 while(scanf("%d%d%d", &n, &k, &MOD) != EOF) 53 { 54 for(int i = 0; i < n; i ++) 55 { 56 for(int j = 0; j < n; j ++) 57 { 58 scanf("%u", &a.m[i][j]); 59 a.m[i][j] %= MOD; 60 E.m[i][j] = (i == j); 61 } 62 } 63 mat ans = sum(k); 64 for(int i = 0; i < n; i ++) 65 { 66 for(int j = 0; j < n-1; j ++) 67 printf("%u ", ans.m[i][j]); 68 printf("%u\n", ans.m[i][n - 1]); 69 } 70 } 71 return 0; 72 }
转载于:https://www.cnblogs.com/huangfeihome/archive/2012/12/27/2836389.html
POJ3233 Matrix Power Series相关推荐
- 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)= ...
- 【矩阵乘法】Matrix Power Series(poj 3233)
Matrix Power Series poj 3233 题目大意 给你一个矩阵A,让你求S=A+A2+A3+-+AkS = A + A^2 + A^3 + - + A^kS=A+A2+A3+-+Ak ...
- Matrix Power Series
http://poj.org/problem?id=3233 题解: 构造矩阵: a:A 1 b:A 0 A 1 其中 矩阵套矩阵: A代表原矩阵: 1代表单 ...
- poj 3233 Matrix Power Series
最近一直在做矩阵的题目,这算是一道简单题目吧. 建立一个矩阵的结构体,便于赋值和返回值. S = A + A2 + A3 + - + Ak 如果 S=A+A2 + A3 +A4 S= (A + A ...
- POJ 3233 Matrix Power Series 矩阵快速幂 + 二分
题意:求矩阵的次方和 解题思路:最容易想到方法就是两次二分因为 我们可以把一段 A^1 + A^2 + .......A^K 变成 A^1 + ..A^(K/2) +( A^1 + ..A^( ...
- POJ 3233 Matrix Power Series (矩阵分块,递推)
矩阵乘法是可以分块的,而且幂的和也是具有线性的. 不难得到 Si = Si-1+A*Ai-1,Ai = A*Ai-1.然后矩阵快速幂就可以了. /*************************** ...
- poj 3323 Matrix Power Series (矩阵乘法 非递归形式)
为了搞自动机+矩阵的题目,特来学习矩阵快速幂..........非递归形式的求Sum(A+A^2+...+A^k)不是很懂,继续弄懂................不过代码简洁明了很多,亮神很给力 # ...
- Matrix Power Series(矩阵快速幂,二分法/构造矩阵套矩阵)
传送门 题意: 思路: 方法一:(二分) 分析: 奇偶分类讨论: 1.代码: #include <iostream> #include <cstdio> #include &l ...
- I-Matrix Power Series POJ - 3233 矩阵快速幂+分治
I-Matrix Power Series POJ - 3233 矩阵快速幂+分治 Problem Description Given a n × n matrix A and a positive ...
最新文章
- 特征重要性、特征集成+FeatureUnion、特征选择变换器+ColumnTransformer、标签特征变换+TransformedTargetRegressor、特征质量、自动学习数据中的特征
- AI发展进入2.0时代!英特尔在落地中总结4大经验、分享7个案例
- 绘制颜色渐变矩形函数
- linux注释内容,Linux 中snmptrapd的内容有大虾能帮我注释下吗?谢谢了
- 使用IAM保护您的AWS基础架构
- Stage划分和Task最佳位置
- linux的日志系统,Linux上的日志系统
- World Wind Java开发之二 使用Winbuilders设计图形用户界面(转)
- c语言程序设计超市会员卡管理系统,c语言程序设计超市管理系统.doc
- 69. Sqrt(x)
- 计算机专业数学建模结课论文,数学建模结课论文3000字论文
- Win10怎么设置自动锁屏? win10自动锁屏的两种方法
- Excel单元格科学计数法转换和小数点取整
- oracle根据身份证号码 计算年龄、性别
- MLY -- 5.your development and test sets
- 爱奇艺视频与腾讯视频竞品分析
- 如何用网页脚本追踪用户
- Java的wait()、notify()学习三部曲之一:JVM源码分析
- 吴恩达深度学习笔记(二)——浅层神经网络
- WPS表格 下拉列表+图表 实现动态显示图表
热门文章
- 安装nginx报错:the HTTP gzip module requires the zlib library
- Android开发笔记(八十五)手机数据库Realm
- PDA连接远程SQL 2005数据库
- Python模块(二)(序列化)
- Eclipse离线安装Emmet插件----web开发者绝对熟悉的插件之一
- C#—Dev XtraTabControl操作总结如动态增加Tab和关闭选项卡方法等
- 当你打开网页的时候,世界都发生了什么(1)
- 设置loadrunner中每个mdrv.exe进程中包含的vuser个数
- 日本新年传统习俗介绍(二)
- java 静态缓存_JAVA缓存的实现