【poj3420】递推式转矩阵乘法
历史性的时刻!!!
推了一晚上!和hyc一起萌萌哒地推出来了!!
被摧残蹂躏的智商啊!!!
然而炒鸡高兴!!
(请不要介意蒟蒻的内心独白。。)
设a[i]为扫到第i行时的方案数。
易知,对于一行1*4的格子,只有一种方案把它铺满。
首先,对于当前的第i行,如果它不和第i-1行有联系(也就是它是独立的一行),那么就有1*a[i-1]=a[i-1]种方案。
如果第i行和第i-1行有联系(2行间互相联系),那么共有一下四种方案:
如果第i行、第i-1行、第i-2行都有联系(3行间两两联系),那么共有两种方案(此图以及的轴对称图形):
如果第i行、第i-1行、第i-2行、第i-3行都有联系(4行间两两联系),那么共有三种方案(上面两种方案加下面一种):
……
一直递推下去,我们可以发现:
2行间相互联系 --> 4种方案
3行间相互联系 --> 2种方案
4行间相互联系 --> 3种方案
……
奇数行相互联系(n>2) --> 2种方案
偶数行相互联系(n>2) --> 3种方案
所以,我们可以得出:
a[i]=a[i-1]+4*a[i-2]+2*(a[i-3]+a[i-5]+……+a[(i&1)?0:1])+3*(a[i-4]+a[i-6]+……+a[(i&1)?1:0]);
设s=a[i-3]+a[i-5]+……+a[(i&1)?0:1],t=a[i-4]+a[i-6]+……+a[(i&1)?1:0];
该递推式可以转化为矩阵乘法:
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; const int N=;
int Mod;
struct node{
int s[][];
int sx,sy;
}; node mult(node a,node b)
{
node t;
t.sx=a.sx;t.sy=b.sy;
memset(t.s,,sizeof(t.s));
for(int i=;i<=a.sx;i++)
for(int j=;j<=b.sy;j++)
for(int k=;k<=a.sx;k++)
{
t.s[i][j]+=(a.s[i][k]*b.s[k][j])%Mod;
t.s[i][j]%=Mod;
}
return t;
} void quickpow(int n)
{
if(n==) {printf("0\n");return ;}
node a;
a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
a.sx=;a.sy=;
node b;
b.s[][]=b.s[][]=b.s[][]=b.s[][]=%Mod;
b.s[][]=b.s[][]=b.s[][]=%Mod;
b.s[][]=b.s[][]=b.s[][]=%Mod;
b.s[][]=b.s[][]=b.s[][]=%Mod;
b.s[][]=b.s[][]=b.s[][]=%Mod;
b.sx=;b.sy=;
while(n)
{
if(n&) b = mult(a,b);
a = mult(a,a);
n>>=;
}
node c;
c.sx=;c.sy=;
c.s[][]=%Mod;c.s[][]=c.s[][]=c.s[][]=%Mod;
c = mult(b,c);
printf("%d\n",c.s[][]);
return ;
} int main()
{
while()
{
int x;
scanf("%d%d",&x,&Mod);
if(x==) return ;
quickpow(x);
}
return ;
}
【poj3420】递推式转矩阵乘法的更多相关文章
- 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 ...
- P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)
https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...
- HDU-6185-Covering(推递推式+矩阵快速幂)
Covering Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化
这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...
- hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)
题意:有一个递推式f(x) 当 x < 10 f(x) = x.当 x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ...
- HDU - 2604 Queuing(递推式+矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU5950 Recursive sequence 非线性递推式 矩阵快速幂
题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...
- POJ 3734 Blocks(矩阵快速幂+矩阵递推式)
题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 . 设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...
随机推荐
- linux里面的fork函数创建一个新进程
由fork创建的新进程成为子进程,fork函数被调用一次,但是返回两次,
- 事务消息中心-TMC
此文已由作者杨凯明授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 背景 为什么要做事务消息中心 原有kqueue的方式缺点: 降低业务库性能 占用业务库磁盘 历史数据管理成本 ...
- 深入理解计算机系统(1)--hello world程序的生命周期
第一篇笔记的主题是讨论Hello World程序的生命周期,程序是最简单的hello world程序,使用高级C语言编写. 先介绍整个生命周期中涉及到的几个部分以及相应的概念,然后总结整个生命周期,最 ...
- (1)分布式下的爬虫Scrapy应该如何做-安装
关于Scrapy的安装,网上一搜一大把,一个一个的安装说实话是有点麻烦,那有没有一键安装的?答案显然是有的,下面就是给神器的介绍: 主页:http://conda.pydata.org/docs/ 下 ...
- vue2.0 watch
类型:string | Function | Object vue官网解释: 一个对象,键是需要观察的表达式,值是对应回调函数.值也可以是方法名,或者包含选项的对象.Vue 实例将会在实例化时调用 $ ...
- web入门脑图
- Android Studio环境解读
一.使用IDE开发APP的流程 要熟悉一个新的IDE,可依次完成以下流程: 二.相关术语解析 Dalvik: Android特有的虚拟机,和JVM不同,Dalvik虚拟机非常适合在移动终端上使用! A ...
- 浅析Python中的main函数
Python作为一门较为灵活的解释型脚本语言,其中定义的main()函数只有当该Python脚本直接作为执行程序时才会执行: 当该python脚本被作为模块(module)引入(import)时,其中 ...
- VS2015中常用快捷键的修改推荐
首先,在VS2015中修改快捷键的步骤如下: 工具--选项--环境--键盘. 如图: 然后就是修改快捷键:(以下是个人的使用习惯,仅供参考) 1.编辑.设置选定内容的格式.设置为ctrl+E,Ctrl ...
- Android调用Java WebSevice篇之一
一.服务端WebService 1.服务端环境配置 MyEclipse 10.0.Tomcat6.0.JDK6.0. 2.下载axis相关jar包. 3.创建webservice. ...