POJ-3734 Blocks

原创 2016年08月30日 20:17:09

题目大意:

有n个blocks,让你用红,蓝,绿,黄四种颜色染上色,其中红色和绿色的block都是偶数个的方案有多少个。

解题思路:

其实这是个DP...啊一脸狗血...

其实模型很像这题....HDU 1143 Tri Tiling

首先,假设dp[i][0]表示当涂了前i个blocks之后,红色和绿色都是偶数个的方案个数,dp[i][1]表示当涂了前i个blocks之后,红色和绿色只有一个是偶数个的方案个数,dp[i][2]表示当涂了前i个blocks之后,红色和绿色都不是偶数个的方案个数

那么状态转移为:

dp[i+1][0] = 2 * dp[i][0] + dp[i][1] 

表示涂了前i+1个之后红色和绿色都是偶数个,那么前i个可以是红色和绿色都是偶数个,第i+1个选择蓝色或黄色,或者前i个是红色和绿色有一个是偶数个,那么第i+1个选择为不是偶数个的那一个。

以此类推。得出所有的状态转移:

dp[i+1][0] = 2 * dp[i][0] + dp[i][1]

dp[i+1][1] = 2 * dp[i][0] + 2 * dp[i][1] + 2 * dp[i][2]

dp[i+1][2] = dp[i][1] + 2 * dp[i][2]

如果你以为就这么结束那真是亦可赛艇...这题关键在于n数量级极大,即使你用滚动数组去维护依旧无法拜托超时的厄运。所以需要加速。

于是矩阵快速幂诞生了。(xjb扯的

怎么转换矩阵快速幂可以参考斐波那契数列...

代码:

#include <cstdio>
#include <cstring>
using namespace std;

const int mod = 10007;
typedef struct node {
	int mat[4][4];
	node() { memset(mat, 0, sizeof(mat)); }
}Matrix;

Matrix operator * (Matrix a, Matrix b) {
	Matrix ans;
	for (int i = 0; i < 3; ++i)
		for (int j = 0; j < 3; ++j)
			for (int k = 0; k < 3; ++k)
				ans.mat[i][j] = (ans.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % mod;
	return ans;
}
Matrix operator ^ (Matrix a, int num) {
	Matrix ans;
	for (int i = 0; i < 3; ++i) ans.mat[i][i] = 1;
	while (num) {
		if (num & 1) ans = ans * a;
		a = a * a;
		num >>= 1;
	}
	return ans;
}
int main() {
	int n, t;
	scanf("%d", &t);
	while (t--) {
		Matrix m;
		scanf("%d", &n);
		m.mat[0][0] = 2; m.mat[0][1] = 1; m.mat[0][2] = 0;
		m.mat[1][0] = 2; m.mat[1][1] = 2; m.mat[1][2] = 2;
		m.mat[2][0] = 0; m.mat[2][1] = 1; m.mat[2][2] = 2;
		m = m ^ n;
		printf("%d\n", m.mat[0][0]);
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[POJ 3734] Blocks (矩阵快速幂、组合数学)

POJ 3734 Blocks 矩阵快速幂 组合数学
  • SIOFive
  • SIOFive
  • 2014年07月07日 17:52
  • 1152

poj 3734 Blocks 递推+矩阵幂优化

点击打开链接 题意 n块block 可以涂上 R,B,G,Y 求n块涂色中 R,G颜色个数为偶数的方法数? 涂到第i块时:设ai RG都为偶数的方案数. bi RG恰好一个为偶数的方案数. ci:...

POJ 3734 Blocks(dp、矩阵快速幂)

题目链接: POJ 3734 Blocks 题意: 有n个格子,每个格子可以涂red,blue,green,yellowred,blue,green,yellow四种颜色之一,但是需要保证所有的...
  • Ramay7
  • Ramay7
  • 2016年04月04日 15:47
  • 200

poj #3734 Blocks(矩阵快速幂)

这题也是属于“dp优化”的一类。本题解法有矩阵快速幂和组合数学两种(后者写起来会简单很多,但是推导过程繁琐),所以选用了矩阵快速幂的方法。 标签:矩阵快速幂 BlocksTime Limit: ...

poj 3734 Blocks 矩阵

#include #include #include #include #include #include using namespace std; #define LL long lon...

POJ 3734 Blocks 生成函数及矩阵的解法

http://poj.org/problem?id=3734 无意中看到这题然后网上看了题解,正好可以用生成函数解决,也看到有用矩阵解决的,所以学习了用两种方法解决该问题。网上也有很多人建议用费马定...

Poj 3734 Blocks【递推+矩阵快速幂】好题

Blocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6239   Accepte...

poj 3734 Blocks(矩阵快速幂)

Blocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6472   Accepted: 3117 ...

poj 3734 Blocks(构造矩阵加快速幂)

题意:N个方块一列,4种

Blocks (POJ - 3734)(矩阵快速幂)

Panda has received an assignment of painting a line of blocks. Since Panda is such an intelligent bo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ-3734 Blocks
举报原因:
原因补充:

(最多只允许输入30个字)