【BZOJ-2476】战场的数目 矩阵乘法 + 递推
2476: 战场的数目
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 58 Solved: 38
[Submit][Status][Discuss]
Description
.jpg)
Input
Output
Sample Input
8
9
10
0
Sample Output
2
0
9
HINT
湖南省第六届大学生计算机程序设计竞赛
Source
Solution
战场的定义比较趋近于俄罗斯方块,及不能有悬空的块;每个块下面必须为底或者是另一个块,并且这些块不能构成一个矩形。
直接入手比较麻烦。
很显然的就是高就是最高的块所在的层数,宽也是最后一层的宽度。
分情况讨论一下,显然只有$p$为偶数的时候才可能有答案,奇数一定无解。
1.如果左/右只有一边存在一个单独的块。
这样删掉这个块将会得到周长为$p-2$时的一种方案。
2.如果左/右都不存在单独一个块。
这样无法通过删单个块得到一种周长为$p-2$的方案,但是,可以通过去掉最后一层得到一种周长为$p-2$的方案。
3.如果左/右都存在一个单独的块。
这种方案,会在情况1中额外统计,所以要减去,而这样的方案数则对应是周长为$p-4$时的方案。
然后就可以得到递推式$f[p]=2*f[p-2]+f[p-2]-f[p-4]=3*f[p-2]-f[p-4]$
然后这个显然是可以矩阵乘法优化的,不过这样会产生一些不必要的内存,所以我们把$p=p/2$然后就可以得到$f[p]=3*f[p-1]-f[p-2]$
这样得到的答案,是满足的情况,是包含正好组成矩形的情况的,所以我们在最后把它减去即可。
有一些小细节,稍微注意一下!
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define LL long long
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define P 987654321
struct Matrix{int a[][]; Matrix() {memset(a,,sizeof(a));}}A,B;
int N,T;
Matrix operator * (Matrix A,Matrix B)
{
Matrix C;
for (int k=; k<=; k++)
for (int i=; i<=; i++)
if (A.a[i][k])
for (int j=; j<=; j++)
if (B.a[k][j])
C.a[i][j]=(C.a[i][j]+((LL)A.a[i][k]*B.a[k][j]+P)%P+P)%P;
return C;
}
Matrix operator ^ (Matrix x,int k)
{
Matrix re; for (int i=; i<=; i++) re.a[i][i]=;
for (int i=k; i; i>>=,x=x*x) if (i&) re=re*x;
return re;
}
int main()
{
A.a[][]=; A.a[][]=-; A.a[][]=;
A.a[][]=; A.a[][]=; A.a[][]=;
A.a[][]=; A.a[][]=; A.a[][]=;
B.a[][]=; B.a[][]=; B.a[][]=;
while ()
{
N=read(); if (!N) break;
if (N& || N<) {puts(""); continue;}
if (N==) {puts(""); continue;}
if (N==) {puts(""); continue;}
Matrix ANS;
ANS=A^(N/-); ANS=ANS*B;
// for (int i=1; i<=3; i++,puts(""))
// for (int j=1; j<=3; j++)
// printf("%d ",ANS.a[i][j]);
printf("%d\n",(ANS.a[][]-(N/-)+P)%P);
}
return ;
}
又发了道水题,很惭愧....
【BZOJ-2476】战场的数目 矩阵乘法 + 递推的更多相关文章
- HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)
题解见X姐的论文 矩阵乘法递推的优化.仅仅是mark一下. .
- 【BZOJ2476】战场的数目 矩阵乘法
[BZOJ2476]战场的数目 Description Input 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周长.p=0表示输 ...
- 【BZOJ-4547】小奇的集合 矩阵乘法 + 递推
4547: Hdu5171 小奇的集合 Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 175 Solved: 85[Submit][Status][D ...
- 【bzoj2476】战场的数目 矩阵乘法优化dp
题目描述 (战场定义为对于最高的一列向两边都严格不增的“用积木搭成”的图形) 输入 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周 ...
- [TJOI2019]甲苯先生的字符串——矩阵乘法+递推
题目链接: [TJOI2019]甲苯先生的字符串 我们用一个$26*26$的$01$矩阵记录任意两个字符是否能相邻. 设$f[i][j]$表示处理完前$i$个字符,第$i$个字符为$j$的方案数. 可 ...
- Bzoj 2875: [Noi2012]随机数生成器(矩阵乘法)
2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2052 Solved: 1118 Description ...
- Luogu 1962 斐波那契数列(矩阵,递推)
Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...
- Ipad,IPhone(矩阵求递推项+欧拉定理)
Ipad,IPhone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- luogu题解 P1707 【刷题比赛】矩阵加速递推
题目链接: https://www.luogu.org/problemnew/show/P1707 分析: 洛谷的一道原创题,对于练习矩阵加速递推非常不错. 首先我们看一下递推式: \(a[k+2]= ...
随机推荐
- IOS 杂笔-16 (-(void)scrollViewDidEndScrollingAnimation:方法使用注意)
今天在写项目的时候,遇到了一件令人抓狂的事情. 正如标题所示,被这个方法弄的团团转. -(void)scrollViewDidEndScrollingAnimation:是协议里的方法. 意味当动画结 ...
- Eclipse部署项目的原理简介eclipse,wtpwebapps,tomcat
转载请注明出处! http://www.cnblogs.com/libingbin/ 感谢您的阅读.如果文章对您有用,那么请轻轻点个赞,以资鼓励.
- Linux(RHEL7.0)下安装nginx-1.10.2
查看当前系统版本是否支持 当前,nginx发布包支持以下Linux操作系统版本: RHEL/CentOS: Version Supported Platforms 5.x x86_64, i386 6 ...
- [转]CTO、技术总监、首席架构师的区别
经常有创业公司老板来拜访我,常常会拜托给我一句话:帮我找一个CTO. 我解释的多了,所以想把这个写下来,看看你到底需要的应该是啥. 一.高级程序员 如果你是一个刚刚创业的公司,公司没有专职产品经理和项 ...
- SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑
本文总结一下SQL SERVER 2012/2014链接到SQL SERVER 2000的各种坑,都是在实际应用中遇到的疑难杂症.可能会有人说怎么还在用SQL SERVER 2000,为什么不升级呢? ...
- [MySQL Reference Manual]14 InnoDB存储引擎
14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...
- ZooKeeper:Quick Start
下载.安装与配置 下载地址 安装 配置 ZooKeeper bin目录下脚本说明 Server 启动.停止 客户端操作 使用简易客户端访问 使用Java客户端访问 使用开源客户端ZkClient访问 ...
- js中操作数组的一些方法
增 push 在数组的末尾添加一个或多个元素,并返回新的长度. array.push(1,2,3.........) unshift 在数组的开头添加一个或多个元素,并返回新的长度. arra ...
- explicit抑制隐型转换
本文出自 http://www.cnblogs.com/cutepig/ 按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: clas ...
- 利用oneproxy部署mysql数据库的读写分离
实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 oneproxy-rhel ...