【题意】

给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

转载于:https://www.cnblogs.com/Konjakmoyu/p/4821101.html

【poj3734】矩阵乘法求解相关推荐

  1. 矩阵乘法求解多项式递推问题

    博客主页: https://blog.csdn.net/qq_50285142 欢迎点赞

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

    出自matrix67.com 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.     不要以为数学 ...

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

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  4. 【转载】ACM中矩阵乘法的应用

    copied from  大神's blog 不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符.在数学中,一个矩阵说穿了就是一个二维数组.一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是 ...

  5. 矩阵之矩阵乘法(转载)

    参考Matrix67:http://www.matrix67.com/blog/archives/276 十个利用矩阵乘法解决的经典题目 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的 ...

  6. 求解斐波那契第n项的几种解法(含矩阵乘法+快速幂) Python实现

    斐波那契数列 首先我们来定义一下斐波那契数列: f(n)={0n = 01n = 1f(n−1)+f(n−2)n > 1f(n)= \begin{cases} 0 & \text {n ...

  7. 【BZOJ2738】矩阵乘法 [整体二分][树状数组]

    矩阵乘法 Time Limit: 20 Sec  Memory Limit: 256 MB [Submit][Status][Discuss] Description 给你一个N*N的矩阵,不用算矩阵 ...

  8. zcmu-1184(矩阵乘法)

    1184: 帮我求算一下斐波那契数吧 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 221  Solved: 42 [Submit][Status][ ...

  9. 循环取矩阵的某行_1.2 震惊! 某大二本科生写的矩阵乘法吊打Mathematica-线性代数库BLAS-矩阵 (上)...

    本文是 1. 线性代数库BLAS​zhuanlan.zhihu.com 系列的第二篇, 将讲述矩阵类的结构和矩阵基础运算的AVX2加速算法. 1. 矩阵类的结构 在讲述矩阵各种算法之前很有必要详解一下 ...

最新文章

  1. 图像识别:能在商业中如何运用
  2. linux命令安装openssl函数库,ubuntu安装openssl库
  3. “References to generic type List should be parameterized”
  4. 使用cf curl查看SAP云平台上的应用各项明细
  5. ctr z撤回反向_matplotlib 3D图上的反向Z轴
  6. react学习(54)--注意传递请求
  7. python颜色表_Python+matplotlib绘制不同大小和颜色散点图实例
  8. Black Box(POJ 1442·TREAP实现)
  9. 常用的几个JQuery代码片段
  10. 复变函数知识总结(1)——序言和准备知识
  11. PHP trim()的使用
  12. 数据库入门教程(SQL Server 2005)----概述
  13. 如何在网页浏览器中缩放网页?
  14. linux系统权限640,linux权限及权限管理
  15. python pip是什么的简写,python pip是什么
  16. 如何制作WinPE启动盘
  17. 简单的静态网页(宠物网)
  18. Golang Fyne项目实战(含源码)
  19. 2017年计算机二级考试的word的答案,2017年3月全国计算机考试等级考试二级《MS Office高级应用》真题及答案...
  20. 数据分析模型 第十一章

热门文章

  1. 坚持完成这套学习手册,你就可以去 Google 面试了
  2. SQL进阶随笔--case用法(一)
  3. 用C#获取硬盘序列号,CPU序列号,网卡MAC地址
  4. es-04-mapping和setting的建立
  5. jquery简单使用入门
  6. Django 实现WEB登陆(第二版)
  7. MySQL DDL操作--------外键最佳实战
  8. JMS分布式应用程序异步消息解决方案EhCache 高速缓存同步问题
  9. 策马扬鞭,踏上新征程。
  10. 14.索引数组初始化