2476: 战场的数目

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 58  Solved: 38
[Submit][Status][Discuss]

Description

Input

输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周长。p=0表示输入结束,你的程序不应当处理这一行。

Output

对于每组数据,输出仅一行,即满足条件的战场总数除以987654321的余数。

Sample Input

7
8
9
10
0

Sample Output

0
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】战场的数目 矩阵乘法 + 递推的更多相关文章

  1. HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)

    题解见X姐的论文 矩阵乘法递推的优化.仅仅是mark一下. .

  2. 【BZOJ2476】战场的数目 矩阵乘法

    [BZOJ2476]战场的数目 Description Input 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周长.p=0表示输 ...

  3. 【BZOJ-4547】小奇的集合 矩阵乘法 + 递推

    4547: Hdu5171 小奇的集合 Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 175  Solved: 85[Submit][Status][D ...

  4. 【bzoj2476】战场的数目 矩阵乘法优化dp

    题目描述 (战场定义为对于最高的一列向两边都严格不增的“用积木搭成”的图形) 输入 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周 ...

  5. [TJOI2019]甲苯先生的字符串——矩阵乘法+递推

    题目链接: [TJOI2019]甲苯先生的字符串 我们用一个$26*26$的$01$矩阵记录任意两个字符是否能相邻. 设$f[i][j]$表示处理完前$i$个字符,第$i$个字符为$j$的方案数. 可 ...

  6. Bzoj 2875: [Noi2012]随机数生成器(矩阵乘法)

    2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2052 Solved: 1118 Description ...

  7. Luogu 1962 斐波那契数列(矩阵,递推)

    Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...

  8. Ipad,IPhone(矩阵求递推项+欧拉定理)

    Ipad,IPhone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  9. luogu题解 P1707 【刷题比赛】矩阵加速递推

    题目链接: https://www.luogu.org/problemnew/show/P1707 分析: 洛谷的一道原创题,对于练习矩阵加速递推非常不错. 首先我们看一下递推式: \(a[k+2]= ...

随机推荐

  1. Git Learning - By reading ProGit

    Today I begin to learn to use Git. I learn from Pro Git. And I recommend it which is an excellent bo ...

  2. 搭建 OpenStack 实验环境 - 每天5分钟玩转 OpenStack(16)

    在学习 OpenStack 各服务之前,让我们先搭建起一个实验环境. 毋庸置疑,一个看得到摸得着而且允许我们随便折腾的 OpenStack 能够提高我们的学习效率. 因为是我们自己学习用的实验环境,C ...

  3. 64位的Ubuntu系统上使用汇编nasm和C语言

    64位的Ubuntu系统上使用汇编nasm和C语言 $ nasm -f elf foo.asm -o foo.o$ gcc -c bar.c -o bar.o$ ld -s  foo.o bar.o ...

  4. 1、策略模式(Strategy)

    //抽象接口 class ReplaceAlgorithm { public: ; }; //三种具体的替换算法 class LRU_ReplaceAlgorithm : public Replace ...

  5. Struts与Struts2的区别

    Struts与Struts2的区别 首先看一张Struts2的发展路线图:       从Struts2的发展过程来看,Struts2继承了Struts与Webwork的特性,形成了新的框架.但是它的 ...

  6. Java Generics and Collections-2.2

    2.2 Wildcards with extends 前面介绍过List<Integer>不是List<Number>的子类,即前者不能替换后者, java使用? extend ...

  7. BZOJ 3112: [Zjoi2013]防守战线 [单纯形法]

    题目描述 战线可以看作一个长度为n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第i 号位置上建一座塔有Ci 的花费,且一个位置可以建任意多的塔,费用累加计算.有m 个区间[L1, R1], [ ...

  8. Java程序设计之最大公约数和最小公倍数

    题目:输入两个正整数number1和number2,求其最大公约数和最小公倍数. 算法:较大数和较小数取余,较小数除余数,一直到余数为0时,为最大公约数(辗转相除法):最大公倍数numbe1*numb ...

  9. 将对象转化成json字符串

    public static String getObjectString(Object object){ String ObjectString = null; try { ObjectMapper ...

  10. webstrom live templates

    javascript: 在live templates底部要选择javascript # $('#$END$') $ $($end$) $bd $(document.body) $d $(docume ...