【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

然后用同样的快速幂求矩阵乘法的方法求解。

代码如下:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #define Mod 10007
 5
 6 struct node
 7 {
 8     int v[5][5];
 9     int m,l;
10 };
11
12 node get_mul(node a,node b)
13 {
14     node c;
15     c.m=a.m;c.l=b.l;
16     for(int i=1;i<=c.m;i++)
17         for(int j=1;j<=c.l;j++)
18         {
19             c.v[i][j]=0;
20             for(int k=1;k<=a.l;k++)
21                 c.v[i][j]=(c.v[i][j]+a.v[i][k]*b.v[k][j])%Mod;
22         }
23     return c;
24 }
25
26 int main()
27 {
28     int T,n;
29     scanf("%d",&T);
30     while(T--)
31     {
32         scanf("%d",&n);
33         node a,b,c;
34         a.m=a.l=3;a.v[1][1]=2;a.v[1][2]=1;a.v[1][3]=0;
35         a.v[2][1]=a.v[2][2]=a.v[2][3]=2;
36         a.v[3][1]=0,a.v[3][2]=1,a.v[3][3]=2;
37         b.m=3,b.l=1,b.v[1][1]=1,b.v[2][1]=0,b.v[3][1]=0;
38         c.m=c.l=3;c.v[1][1]=c.v[2][2]=c.v[3][3]=1;
39         c.v[1][2]=c.v[1][3]=c.v[2][1]=c.v[2][3]=c.v[3][1]=c.v[3][2]=0;
40         while(n)
41         {
42             if(n&1) c=get_mul(c,a);
43             a=get_mul(a,a);
44             n>>=1;
45         }
46         c=get_mul(c,b);
47         printf("%d\n",c.v[1][1]);
48     }
49     return 0;
50 }

poj3734

有人能教我如何漂亮地打表么?

2015-09-19 10:57:49

时间: 2024-11-03 14:38:22

【poj3734】矩阵乘法求解的相关文章

CH Round #30 摆花[矩阵乘法]

摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看了.假定每种花数量无限,求摆花的方案数. 输入格式 输入有1+m行,第一行有两个用空格隔开的正整数n.m,m表示花的种类数.接下来的m行,每行有m个字符1或0,若第i行第j列为1,则表示第i种花和第j种花不能排在相邻的位置,输入保证对称.(提示:同一种花可能不能排在相邻位置). 输出格式 输出只有一

学习心得:《十个利用矩阵乘法解决的经典题目》from Matrix67

本文来自:http://www.matrix67.com/blog/archives/tag/poj大牛的博文学习学习 节选如下部分:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律:二,矩阵乘法满足结合律经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置.操作有平移.缩放.翻转和旋转    这 里的操作是对所有点同时进行的.其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心.如果对每个点分别进行模拟,那么m个操作总共耗时 O(mn).利用矩阵乘法可

十个利用矩阵乘法解决的经典题目

转载自    Matrix67: The Aha Moments 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.    不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符.在数学中,一个矩阵说穿了就是一个二维数组.一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个

[转]十个利用矩阵乘法解决的经典题目

好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.    不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符.在数学中,一个矩阵说穿了就是一个二维数组.一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和.比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵

没涉及到最值求解;观点:矩阵乘法无法表达出结果。 现实生活中事件、现象的数学表达

小结: 1. 矩阵就是一张普通的数表 矩阵乘法它表达的是一件具体的有现实生活场景的事件:但是不能借助它表达所有的事件. 它能,可能是只能,表达的是这个事件是通过列元素和行元素的相乘,而不能在拆分为单独的两个2行-列元素: 事件的原子不是某个行/列元素,而是一行/列元素. 3个菜市场卖着不同价格的白菜.萝卜.土豆:求总采购支出:采购量矩阵*价格矩阵 3个菜市场卖着不同价格的白菜.萝卜.土豆,现在在总采购支出计入运费,而不同的菜市场不同蔬菜的单位重量运费为价格的不同倍:例如第一个菜市场的白菜.萝卜.

快速求斐波那契数列(矩阵乘法+快速幂)

斐波那契数列 给你一个n:f(n)=f(n-1)+f(n-2) 请求出 f(f(n)),由于结果很大请 对答案 mod 10^9+7; 1<=n<=10^100; 用矩阵乘法+快速幂求斐波那契数列是经典应用: 矩阵公式 C i j=C i k *C k j; 根据递推式 构造2*2矩阵: 原始矩阵 1 0 0 1 矩阵 2 1 1 1 0 原始矩阵与矩阵 2相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有

用矩阵乘法优化递推

(有关矩阵乘法的基本规则请自行搜索) 引例:求斐波那契数列的第 n 项 mod 1000000007 的值,n <= 1018. 分析:斐波那契数列的递推式为 f(n) = f(n-1)+f(n-2),直接循环求出 f(n) 的时间复杂度是 O(n),对于题目中的数据范围显然无法承受.很明显我们需要对数级别的算法. 由于 f(n) = 1*f(n-1) + 1*f(n-2) 这样的形式很类似于矩阵的乘法,所以我们可以先把这个问题复杂化一下,将递推求解 f(n) 与 f(n-1) 的过程看作是某两

【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两个不同端点A_j和B_j (1 <= A_j<= N; 1 <= B_j <= N)表示的双向道路连接.保证城市1至少连接一个其它的城市.一开始臭气弹会被放在城市1.每个小时(包括第一个小时),它有P/Q (1 <= P <=1,000,000; 1 <= Q <

那条矩阵乘法的不归路——数列

话说今天搜矩阵相乘,没有一个人用pascal写,是不是学到矩阵相乘的孩子都果断转c++了...我可是有良心的写博人,当然附上pascal代码 故事开始了 今天看到这样一个题 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1]  (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. 然后是它的数据范围 对于30%的数据 n<=100: 对于60%的数据 n<=2*10^7: 对于100%的数据 T<=100,n<=2*10^9: 当我