【poj3734】矩阵乘法求解
【题意】
给N个方块排成一列。现在要用红、蓝、绿、黄四种颜色的油漆给这些方块染色。求染成红色方块和染成绿色方块的个数同时为偶数的染色方案的个数,输出对10007取余后的答案。(1<=n<=10^9)。
【分析】
看到这题的题目的第一想法是什么呢?我也不知道,因为还没做就知道是一道用矩阵乘法完成递推的题目了嘛!!
之前对矩阵乘法的理解不是很好,不知道可以同时推很多个元素的,于是脑子就卡了~~不写那么多乱七八糟的想法了,直接写题解吧。
当我们准备准备染第i个方块的时候,前i-1个方块已经染好颜色了。对于我们的目标颜色红色和绿色,根据我们想要红绿同时为偶的想法,我们可以把前i-1个方块的染色分成3种情况:
1.红色和绿色同时为偶数的方案数
2.红色和绿色中一个偶数一个奇数的方案数
3.红色和绿色同时为奇数的方案数
我们记前3种情况的方案数为ai-1,bi-1,ci-1。
我们最后需要的是an,但是我们需要a,b,c进行递推。
根据以上想法,我们希望用ai-1,bi-1,ci-1推出ai,bi,ci。
那么,多一个格子染色方案有多少个,是很容易推出来的哦:
ai=2*ai-1+bi-1;
bi=2*ai-1+2*bi-1+2*ci-1;
ci=bi-1+2*c-1;
根据这个递推式,我们可以得到矩阵A:
| 2 | 1 | 0 |
| 2 | 2 | 2 |
| 0 | 1 | 2 |
矩阵B为i=0的时候a,b,c的值:
| 1 |
| 0 |
| 0 |
然后用同样的快速幂求矩阵乘法的方法求解。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define Mod 10007 struct node
{
int v[][];
int m,l;
}; node get_mul(node a,node b)
{
node c;
c.m=a.m;c.l=b.l;
for(int i=;i<=c.m;i++)
for(int j=;j<=c.l;j++)
{
c.v[i][j]=;
for(int k=;k<=a.l;k++)
c.v[i][j]=(c.v[i][j]+a.v[i][k]*b.v[k][j])%Mod;
}
return c;
} int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
node a,b,c;
a.m=a.l=;a.v[][]=;a.v[][]=;a.v[][]=;
a.v[][]=a.v[][]=a.v[][]=;
a.v[][]=,a.v[][]=,a.v[][]=;
b.m=,b.l=,b.v[][]=,b.v[][]=,b.v[][]=;
c.m=c.l=;c.v[][]=c.v[][]=c.v[][]=;
c.v[][]=c.v[][]=c.v[][]=c.v[][]=c.v[][]=c.v[][]=;
while(n)
{
if(n&) c=get_mul(c,a);
a=get_mul(a,a);
n>>=;
}
c=get_mul(c,b);
printf("%d\n",c.v[][]);
}
return ;
}
poj3734
有人能教我如何漂亮地打表么?
2015-09-19 10:57:49
【poj3734】矩阵乘法求解的更多相关文章
- CH Round #30 摆花[矩阵乘法]
摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...
- 学习心得:《十个利用矩阵乘法解决的经典题目》from Matrix67
本文来自:http://www.matrix67.com/blog/archives/tag/poj大牛的博文学习学习 节选如下部分:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律:二,矩阵乘法满足 ...
- 【转】Matrix67:十个利用矩阵乘法解决的经典题目
好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质. 不要以为数学中的矩阵也是黑色屏幕上不断变化的 ...
- 矩阵乘法code
VOJ1067 我们可以用上面的方法二分求出任何一个线性递推式的第n项,其对应矩阵的构造方法为:在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0.例如 ...
- 分治与递归-Starssen矩阵乘法
代码实现: /** * 矩阵乘法求解 * @author Administrator * */ public class Strassen { public static final int NUMB ...
- 第四章 分治策略 4.2 矩阵乘法的Strassen算法
package chap04_Divide_And_Conquer; import static org.junit.Assert.*; import java.util.Arrays; import ...
- 【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】
目录: 1:一道简单题[树形问题](Bzoj 1827 奶牛大集会) 2:一道更简单题[矩阵乘法][快速幂] 3:最简单题[技巧] 话说这些题目的名字也是够了.... 题目: 1.一道简单题 时间1s ...
- 【poj3070】矩阵乘法求斐波那契数列
[题目描述] 我们知道斐波那契数列0 1 1 2 3 5 8 13…… 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. [ ...
- 矩阵乘法的MPI并行计算
1.问题描述 矩阵乘法问题描述如下: 给定矩阵A和B,其中A是m*p大小矩阵,B是p*n大小的矩阵.求C = A*B. 求解这个问题最简单的算法是遍历A的行和B的列,求得C的相应元素,时间复杂度O(m ...
随机推荐
- 使用JUnit4与JMockit进行打桩测试
1. 何为Mock 项目中各个模块,各个类之间会有互相依赖的关系,在单元测试中,我们只关心被测试的单元,对于其依赖的单元并不关心(会有另外针对该单元的测试). 比如,逻辑层A类依赖了数据访问层B类的取 ...
- js 获取当前时间格式怎么转换?
toLocaleDateString() 得到的时间是 yyyy年MM月dd日 HH:ss:mm 格式的,怎么转换成yyyy-MM-dd HH:ss:mm 在js里面 仅针对这个问题来说,不需要那么大 ...
- 在html页,使用ctrl,shift多选表格行
前段时间,项目中遇到这样一个需求.需要在页面中像windows资源管理器中一样可以使用ctrl和shift键来多选. <html> <head> <style> b ...
- MD5Untils加密工具类
package com.dzq.utils; import java.math.BigInteger; import java.security.MessageDigest; import java. ...
- win10 Administrator
和Win7/Win8.1一样,Win10的管理员账户Administrator是默认隐藏和关闭的,因为该账户权限极高,被不法分子利用后存在极大风险.但如果你想在某些特殊情况下使用该账户,就需要手动将其 ...
- static的用途
1)限制变量的作用域:即在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变: 2)限制变量的存储域:<a>在模块内(但在函数体外),一个被声明为静态的变量,可以被模块内的所 ...
- dbms_job和dbmsi_job
工作中可能遇到这样的情况,在A用户下有一个不用的job,但是dba不知道A用户的密码,怎么删除这个job呢. 相信大部分人都会尝试在sys用户下用dbms_job.remove()命令去删除它,但 ...
- Objective-c单例模式详解
转载自:http://www.jianshu.com/p/85618bcd4fee 单例模式出现以后,关于它的争执就一直存在.在开发项目中,有很多时候我们需要一个全局的对象,而且要保证全局有且仅有一份 ...
- phaser源码解析(二) Phaser.Utils类下pad方法
/** *#填充字符串方法 * Javascript string pad http://www.webtoolkit.info/. * pad = the string to pad it out ...
- 每天一水SGU347
今天本来应该要写校题解报告的,但是CF跪了,一题都没JUDGE出来,最后比赛取消了~郁闷啊! 后来闲的无事,就到处看看contest,随便点进去一个,看到一水题,几分钟写完,马上就WA了!~ 题目的信 ...