【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 ...
随机推荐
- Java NIO Socket 非阻塞通信
相对于非阻塞通信的复杂性,通常客户端并不需要使用非阻塞通信以提高性能,故这里只有服务端使用非阻塞通信方式实现 客户端: package com.test.client; import java.io. ...
- php中的全局变量引用
全局变量在函数外部定义,作用域为从变量定义处开始,到本程序文件的末尾.但和其他语言不同,php的全局变量不是自动设为可用的,在php中函数可以视为单独的程序片段,局部变量会覆盖全局变量的能见度,因此, ...
- XML操作 之获取指定节点值
根据节点名称快速查找 指定节点值 using (TextReader stringReader = new StringReader(clearPassResponse)) { XmlReaderSe ...
- 如何创建windows xp 虚拟机
如何创建windows xp 虚拟机 一.所需软件 1. VMware-workstation-full-12.0.0-2985596 赠送vm12 激活key一枚: 5A02H-AU243 ...
- Android 设置ListView不可滚动 及在ScrollView中不可滚动的设置
http://m.blog.csdn.net/blog/yusewuhen/43706169 转载请注明出处: http://blog.csdn.net/androiddevelop/article/ ...
- Windows 7中,用Visual Studio开发WPF应用程序,实现从Windows Explorer中拖拽文件到应用程序,始终显示“无法拖放”符号问题解决方案
Are you running your application or Visual Studio that hosts the app under administrative privilege? ...
- swift-闭包和类的声明
//闭包:类似Oc中的block 反向传值引起代码的回调 func hasClosureMathes(arr : [Int],value:Int,cb:(num:Int,value : Int)-&g ...
- ZOJ 1025 Wooden Sticks(快排+贪心)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=25 题目大意:机器运送n个木条,每个木条有一个长度和重量.运送第一根木 ...
- UVA 11078 Open Credit System(扫描 维护最大值)
Open Credit System In an open credit system, the students can choose any course they like, but there ...
- .net日志专用
一个简单的.net写日志方法 - 可能的改进点 昨天有个朋友在评论的时候问我如下代码在web开发中有什么问题 public void Log(string msg) { System.IO.File. ...