POJ 3734 Blocks 矩阵递推
比较简单的递推题目,只需要记录当前两种颜色均为偶数, 只有一种颜色为偶数 两种颜色都为奇数 三个数量即可,递推方程相信大家可以导出。
最后来个快速幂加速即可。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
typedef long long int LL;
const LL mt_MAXN=60;const LL mt_MAXM=60;
struct Matrix
{
LL n,m;
LL MOD;
LL a[mt_MAXN][mt_MAXM];
void clear()
{
n=m=0;
memset(a,0,sizeof(a));
}
Matrix operator +(const Matrix &b)const
{
Matrix tmp;
tmp.n=n;tmp.m=m;tmp.MOD=MOD;
for(LL i=0;i<n;++i)
for(LL j=0;j<m;++j)
tmp.a[i][j]=(a[i][j]+b.a[i][j])%MOD;
return tmp;
}
Matrix operator -(const Matrix &b)const
{
Matrix tmp;
tmp.n=n;tmp.m=m;tmp.MOD=MOD;
for(LL i=0;i<n;++i)
for(int j=0;j<m;++j)
tmp.a[i][j]=(a[i][j]-b.a[i][j]+MOD)%MOD;
return tmp;
}
Matrix operator *(const Matrix &b)const
{
Matrix tmp;
tmp.clear();
tmp.n=n;tmp.m=b.m;tmp.MOD=MOD;
for(LL i=0;i<n;++i)
for(LL j=0;j<b.m;++j)
for(LL k=0;k<m;++k)
tmp.a[i][j]=(tmp.a[i][j]+((a[i][k])*(b.a[k][j]))%MOD+MOD)%MOD;
return tmp;
} Matrix iden()
{
Matrix x;
memset(x.a,0,sizeof(x.a));
x.m=n;x.n=n;
x.MOD=MOD;
for(LL i=0;i<n;++i)
x.a[i][i]=1;
return x;
}
Matrix pow(LL t)
{
Matrix now;
now.n=n;now.m=m;now.MOD=MOD;
memset(now.a,0,sizeof(now.a));
for(LL i=0;i<n;++i)
for(LL j=0;j<m;++j)
now.a[i][j]=a[i][j];
for(LL i=1;i<t;i++)
now=now*now;
return now;
}
Matrix qpow(LL t)
{
if(n==0)return iden();
Matrix now;
now.clear();
now.n=n;now.m=m;now.MOD=MOD;
now=pow(1);
Matrix ans;
ans.clear();
ans.n=n;ans.m=m;ans.MOD=MOD;
ans=ans.iden();
while(true)
{
if(t%2==1)ans=ans*now;
t=t/2;
now=now*now;
if(t==0)break;
}
return ans;
}
}; int main()
{
int T;
scanf("%d",&T);
Matrix p;
p.clear();
p.n=p.m=3;
p.a[0][0]=2;p.a[0][1]=1;
p.a[1][0]=p.a[1][1]=p.a[1][2]=2;
p.a[2][1]=1;p.a[2][2]=2;
p.MOD=10007;
Matrix p0;
p0.clear();
p0.n=3;p0.m=1;
p0.a[0][0]=2;
p0.a[1][0]=2;
while(T--)
{
LL n;
scanf("%lld",&n);
Matrix pn=p.qpow(n-1);
Matrix ans=pn*p0;
printf("%lld\n",ans.a[0][0]);
}
return 0;
}
POJ 3734 Blocks 矩阵递推的更多相关文章
- [POJ 3734] Blocks (矩阵高速幂、组合数学)
Blocks Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3997 Accepted: 1775 Descriptio ...
- POJ 3734 Blocks(矩阵快速幂+矩阵递推式)
题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 . 设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...
- POJ 3734 Blocks (线性递推)
定义ai表示红色和绿色方块中方块数为偶数的颜色有i个,i = 0,1,2. aij表示刷到第j个方块时的方案数,这是一个线性递推关系. 可以构造递推矩阵A,用矩阵快速幂求解. /*********** ...
- POJ 1664 放苹果 (递推)
题目链接:http://poj.org/problem?id=1664 dp[i][j]表示i个盘放j个苹果的方案数,dp[i][j] 可以由 dp[i - 1][j] 和 dp[i][j - i] ...
- HOJ 2148&POJ 2680(DP递推,加大数运算)
Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4561 Accepted: 17 ...
- POJ 2506 Tiling(递推+大整数加法)
http://poj.org/problem?id=2506 题意: 思路:递推.a[i]=a[i-1]+2*a[i-2]. 计算的时候是大整数加法.错了好久,忘记考虑1了...晕倒. #includ ...
- POJ 1661 Help Jimmy(递推DP)
思路: 1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间 2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上 总结: 1. 计 ...
- HDU 1757 A Simple Math Problem 【矩阵经典7 构造矩阵递推式】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (J ...
- SPOJ:Fibonacci Polynomial(矩阵递推&前缀和)
Problem description. The Fibonacci numbers defined as f(n) = f(n-1) + f(n-2) where f0 = 0 and f1 = 1 ...
随机推荐
- 如果由你来设计 12306.cn,你会怎么设计?
作者:huangkun链接:https://www.zhihu.com/question/20017917/answer/15272038来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- sed输出指定行
and line ,8p to line ,8p -e 20p - and line -n:取消默认输出.注意:sed命令会默认把输入行打印到屏幕上,所以如果想精准的控制输出,就需要-n. -e:进行 ...
- linux traceroute-显示数据包到主机间的路径
博主推荐:更多网络测试相关命令关注 网络测试 收藏linux命令大全 traceroute命令用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节. 通过traceroute我 ...
- 创建Tensor
目录 创建Tensor numpy, list numpy list zeros, ones, fill zeros ones fill random 打乱idx后,a和b的索引不变 constant ...
- auto_ptr 实现
#ifndef MYAUTOPTR_H #define MYAUTOPTR_H template<typename _T> class MyAutoPtr { private: _T* _ ...
- 洛谷 4932 洛谷10月月赛II T1 浏览器
[题解] x xor y的结果在二进制下有奇数个1,等价于x与y在二进制下的1的个数之和为奇数,因为x xor y减少的1的个数一定是偶数(两个数这一位都为1,xor的结果为0,减少了2个1) 那么答 ...
- noi.ac NOIP2018 全国热身赛 第二场 T3 color
[题解] 我们可以发现每次修改之后叶子结点到根的路径最多分为两段:一段白色或者黑色,上面接另一段灰色的.二分+倍增找到分界点,然后更新答案即可. check的时候只需要判断当前节点对应的叶子结点的区间 ...
- 九度教程第22题——今年暑假不AC(看尽量多的电视节目)
#define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <algorithm> using namespace ...
- 牛客网暑期ACM多校训练营(第二场)B discount
链接:https://www.nowcoder.com/acm/contest/140/B来源:牛客网 题目描述 White Rabbit wants to buy some drinks from ...
- Linux笔记:定时任务和文件操作
查看定时任务 crontab -l 注册定时任务 crontab -e然后就像 vim 一样编辑自己的定时任务.如: * * * * * . /home/hadoop/timer/check_job. ...