POJ 3734
题目的大意:
给定待粉刷的n个墙砖(排成一行),每一个墙砖能够粉刷的颜色种类为:红、蓝、绿、黄,
问粉刷完成后,红色墙砖和蓝色墙砖都是偶数的粉刷方式有多少种(结果对10007取余).
解题思路:
思路用的是递推.如果粉刷到第i个墙砖时,使用的红色墙砖和蓝色墙砖都是偶数的方案
数有ai,使用的红色和蓝色墙砖一奇一偶的方案数为bi,使用的红色和蓝色墙砖都是奇数的
方案数为ci,那么,我们easy得到以下的递推式:
看到上式,对于学过线代的人来说一定不陌生,我们能够将其写成矩阵的形式,然后会发现该
递推式是等比数列的形式.
对于求取ai,我们可通过计算对应矩阵的幂得知,计算矩阵的幂,利用高速二分幂,
可将时间复杂度降为O(lgn).
解题代码:
#include<vector>
#include<iostream>
#include<algorithm>
#define M 10007
using namespace std;
//矩阵乘法
vector<vector<int> > multi(vector<vector<int> > &A, vector<vector<int> > &B)
{
vector<vector<int> > C(A.size(), vector<int>(B[0].size()));
for (unsigned i = 0; i != A.size(); ++i)
for (unsigned j = 0; j != B[0].size(); ++j)
for (unsigned k = 0; k != B.size(); ++k)
C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;
return C;
}
//二分高速幂
vector<vector<int> > power(vector<vector<int> > &A, int n)
{
vector<vector<int> > B(A.size(), vector<int>(A.size()));
for (int i = 0; i != A.size(); ++i)
B[i][i] = 1;
while (n)
{
if (n & 1)
B = multi(B, A);
A = multi(A, A), n >>= 1;
}
return B;
}
int main()
{
int t,n;
cin >> t;
while (t--)
{
vector<vector<int> > A(3, vector<int>(3));
A[0][0] = 2, A[0][1] = 1, A[0][2] = 0;
A[1][0] = 2, A[1][1] = 2, A[1][2] = 2;
A[2][0] = 0, A[2][1] = 1, A[2][2] = 2;
cin >> n;
A = power(A, n);
cout << A[0][0] << endl;
}
return 0;
}
POJ 3734的更多相关文章
- [POJ 3734] Blocks (矩阵高速幂、组合数学)
Blocks Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3997 Accepted: 1775 Descriptio ...
- poj 3734 Blocks
ゲート 分析:这题过的人好多,然后大家好像是用矩阵过的(((φ(◎ロ◎;)φ))).我自己是推公式的. 对于任意的有这个式子, 就是先从里面选偶数个涂成两个指定的颜色,再在选出的里面选定涂某种颜色,选 ...
- poj 3734 Blocks 快速幂+费马小定理+组合数学
题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...
- poj 3734 矩阵快速幂+YY
题目原意:N个方块排成一列,每个方块可涂成红.蓝.绿.黄.问红方块和绿方块都是偶数的方案的个数. sol:找规律列递推式+矩阵快速幂 设已经染完了i个方块将要染第i+1个方块. a[i]=1-i方块中 ...
- Blocks(POJ 3734 矩阵快速幂)
Blocks Input The first line of the input contains an integer T(1≤T≤100), the number of test cases. E ...
- poj 3734 方块涂色 求红色 绿色方块都为偶数的方案数 (矩阵快速幂)
N个方块排成一列 用红,蓝,绿,黄4种颜色去涂色,求红色方块 和绿色方块个数同时为偶数的 方案数 对10007取余 Sample Input 212Sample Output 2//(蓝,黄)6//( ...
- POJ 3734 Blocks (矩阵快速幂)
题目链接 Description Panda has received an assignment of painting a line of blocks. Since Panda is such ...
- POJ 3734 生成函数
题意:一排n长度的砖,有四种颜色,红色绿色是偶数,有少染色方式. 分析: 泰勒展开式: chx = (e^x+e^(-x))/2 = 1 + x^2/2! + x^4/4! + x^6/6! + .. ...
- POJ 3734 Blocks(矩阵快速幂+矩阵递推式)
题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 . 设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...
随机推荐
- java MYSQL做分页
MySql中查询语句实现分页功能 语句: select * from 表名 where 条件 limit 要找第几页,每页多少行; import java.util.*; import java.sq ...
- UITextView -- 基础备忘
UITextView 这篇文章只涉及到基本的使用,日后会写一些关于结合TextKit的备忘 基本属性 let screenSize = UIScreen.mainScreen().bounds.siz ...
- Steam游戏黑屏与游戏直接安装方法
黑屏原因主要是360禁止了反作弊进程,解决方法: Steam游戏目录: Steam\steamapps\common\*** 例如黎明杀机,备份时候可直接备份该目录下 Dead by Daylight ...
- bootstrap table 服务器分页
1.封装MODEL using System;using System.Collections.Generic;using System.Linq;using System.Text;using Sy ...
- Mysql table ful
http://ourmysql.com/archives/1327 http://blog.csdn.net/kevon_sun/article/details/7967728 http://my.o ...
- UVA 10716 Evil Straw Warts Live(贪心)
Problem D: Evil Straw Warts Live A palindrome is a string of symbols that is equal to itself when re ...
- android webview js交互 第一节 (java和js交互)
转载请注明出处 挺帅的移动开发专栏 http://blog.csdn.net/wangtingshuai/article/details/8631835 在androi ...
- CPU acceleration status:HAXM must be updated(version 1.1.1<6.0.1)
终于上手as了,感觉很爽 但是感觉也特闹心啊 还好有stackoverflow(这特么才是一个神奇的网站好吗) 废话少说 记录一下: 前面历经的磨难暂时不说了,就这个CPU acceleration ...
- 组合计数(polya计数):SGU 282 Isomorphism
因为论文的题解写得太好了,直接贴. #include <iostream> #include <cstring> #include <cstdio> using n ...
- HDOJ -- 1015
1.DFS #include<cmath> #include<cstdio> #include<cstdlib> #include<string> #i ...