【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]为红绿恰有一个是偶数 ...
随机推荐
- Java - 问题集 - 导出csv文件中文乱码
微软的excel文件需要通过文件头的bom来识别编码,所以写文件时,需要先写入bom头. FileOutputStream fos = new FileOutputStream(new File(&q ...
- UIButton内部子控件自定义布局-“UIEdgeInsets”
UIButton UIButton做frame动画时,不响应点击 在一个View内部加入几个按钮,然后改变这个view的frame来做动画,但是按钮不响应点击事件. 问题代码 __block CGRe ...
- django2.0 以上版本安装 xadmin
1.xadmin的下载 源码包下载地址: https://github.com/sshwsfc/xadmin/tree/django2 2.使用命令安装xadmin pip install 你下载的压 ...
- SpringBoot:工厂模式实现定时任务可配置
pringBoot:工厂模式实现定时任务可配置 需要:使用springboot,实现定时任务可配置. 定时任务可在代码中写死,在配置文件中配置,这些都不能实现定时任务在服务器不重启的情况下可配置. 为 ...
- 【虚拟货币钱包】从 BIP32、BIP39、BIP44 到 Ethereum HD Wallet
干货 | [虚拟货币钱包]从 BIP32.BIP39.BIP44 到 Ethereum HD Wallet {{uploading-image-882090.png(uploading...)}}
- c++调用Python基础功能
c++调用Python首先安装Python,以win7为例,Python路径为:c:\Python35\,通过mingw编译c++代码.编写makefile文件,首先要添加包含路径:inc_path ...
- poj1789 Truck History最小生成树
Truck History Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 20768 Accepted: 8045 De ...
- 基于phonegap,html5,ratchet,handlebars等技术的微表情APP
该app是由很多有意思的微表情构成的,支持40种表情,并且每种表情都有不同的状态,主要有搜索表情,分享表情,摇一摇换表情等功能.目前只支持安卓版.由前期构思,到技术选型,到界面设计,到编码测试,再到发 ...
- valgrind使用
参数配置 gcc -g: 增加调试信息,供valgrind精确定位. -O0:关闭gcc优化:优化产生的代码可能会造成valgrind误判. valgrind --leak-check=full no ...
- Cache的封装和使用
ICache 接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...