题目描述

给你下列7种形状,问恰好填满 \(n*2\) 的方格有多少种方案(每种形状可任意旋转)

后三种形状纯粹是出题人的恶趣味,d用没有

做法一:暴力

不会

做法二:递推

定义:

  • f[i] 为填满 \(i*2\) 的方格的方案数
  • g[i] 为填满 \(i*2\) 的方格 不能被腰斩 的方案数

解释:例如当 \(n = 4\) 时,下列第一种画法能被腰斩,第二种不能

初步分析

很容易得到, 当 \(i\) 为奇数时 答案答案显然为0

\[f[0] = 1, g[0] = 1, f[2] = 1, g[2] = 1, f[4] = 4, g[4] = 3
\]

当i为大于4的偶数时

\[f[i] = g[i] * f[0] + g[i - 2] * f[2] + g[i - 4] * f[4] + ... + g[2] * f[i - 2]
\]

进一步发现

\[g[i] = 2
\]

解释:上下两端用第3, 第4种方块, 中间用2填满

然后可以得到递推式

\[f[i] = 2 * (f[0] + f[2] + f[4] + ... f[i - 6]) + 3 * f[i - 4] + f[i - 2]
\]

前面一部分可用前缀和优化一下变为:

\[f[i] = 2 * (sum[i - 6]) + 3 * f[i - 4] + f[i - 2]
\]

发现奇数项根本没有用,优化一下空间

\[f[i] = 2 * (sum[i - 3]) + 3 * f[i - 2] + f[i - 1]
\]

此时答案为 \(f[\dfrac{n}{2}]\)

进一步优化

\(O(n)\) 做法跑 \(10^{18}\) 肯定会爆,考虑上述式子用矩阵乘法优化

\[\left[ \begin{matrix}
f[i] \\
f[i - 1] \\
sum[i - 2]
\end{matrix}
\right] =
\left[
\begin{matrix}
1 & 3 & 2\\
1 & 0 & 0\\
0 & 1 & 1
\end{matrix}
\right]
\left[
\begin{matrix}
f[i - 1] \\
f[i - 2] \\
sum[i - 3]
\end{matrix}
\right]

\]

至此,复杂度优化为\(O(logn)\)

AC代码

#include<iostream>
#include<cstring>
#define ll long long using namespace std;
const ll P = 1e9 + 7, N = 2e6; ll f[3] = {1, 1, 4};
ll sum[3] = {1, 2, 6};
ll n; void mul(ll a[3][3], ll b[3][3]) {
ll c[3][3]; memset(c, 0, sizeof c);
for(int k = 0; k < 3; k ++) {
for(int i = 0; i < 3; ++ i)
for(int j = 0; j < 3; ++ j)
c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % P;
}
memcpy(a, c, sizeof c);
} ll q_pow(ll b) {
if(b < 3) return f[b];
ll ret[3][3] = {1, 0, 0, 0, 1, 0, 0, 0, 1};
ll a[3][3] = { 1, 3, 2, 1, 0, 0, 0, 1, 1}; ++ b;
while(b) {
if(b & 1) mul(ret, a);
mul(a, a);
b >>= 1;
}
return ret[1][0];
} int main() {
while(scanf("%lld", &n) != EOF) {
if(n & 1) puts("0");
else printf("%lld\n", q_pow(n / 2));
}
return 0;
}

其他做法

机房大佬说这题就是斐波那契第n项的平方

我太弱了不会推

20231112多校模拟T2的更多相关文章

  1. [NOIP2018校模拟赛]T2矩阵分组 Matrix

    题目链接: 矩阵分组 分析: 这道题求的是两部分极差当中大的那个的最小值.对于这种求最值的问题,我们很自然(其实并没有)地想到二分答案. 这个题有两个结论: (好像当时看出来了第一个?然后发现下面都不 ...

  2. Day1:T1 模拟 T2 拓扑排序

    T1:模拟 自己第一天的简直跟白痴一样啊...模拟都会打错.. 当时貌似在更新最大值的时候打逗比了... if((sum[x]==max && x<maxh) || sum[x] ...

  3. HDU5399-多校-模拟

    Too Simple Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. NOIP2012 普及组真题 4.13校模拟

    考试状态: 我今天抽签看了洛谷的… 这我能怂???凶中带吉,我怕考试??我!不!怕! 看着整个机房的男同学们,我明白我是不会触发我的忌了.很好,开刷. A. [NOIP2012普及组真题] 质因数分解 ...

  5. NOIP2019普及级别模拟 3.30校模拟

    好吧我还是第一次写这种总结类的玩意… 考场心情…hmm…我没睡醒.是的是这样的,反正题都有两三个看错了或者没看懂… 最关键的是!!我!居!然!把!Freopen!写!在!了!程!序!最!后! 然后就和 ...

  6. [NOIP2018校模拟赛]T1 阶乘

    题目: 描述 有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值. 输入 共两行. 第一行一个正整数n. 第二行n个正整数a[i]. 输出 共 ...

  7. [NOIP2018校模拟赛]T1聚会 party

    题目链接: 聚会 分析: 设每个点到1号点的距离为dist_{i},每个点的权值为x_{i},目标点到1号点的距离为dist,权值为x,那么对于每一次查询,我们讨论三种情况: ① 目标家庭在区间左边( ...

  8. 九校模拟——餐馆(restaurant)

    1 餐馆(restaurant) 1.1 题目背景 铜企鹅是企鹅餐馆的老板,他正在计划如何使得自己本年度收益增加. 1.2 题目描述 共有n 种食材,一份食材i 需要花ti 小时不间断地进行播种,施肥 ...

  9. 7.12模拟T2(套路容斥+多项式求逆)

    Description: \(n<=10,max(w)<=1e6\) 题解: 考虑暴力,相当于走多维格子图,不能走有些点. 套路就是设\(f[i]\)表示第一次走到i的方案数 \(f[i] ...

  10. 「题解」:07.16NOIP模拟T2:通讯

    问题 B: 通讯 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此 ...

随机推荐

  1. 浅谈分布式任务调度系统Celery的设计与实现

    Celery是一个简单.灵活且可靠的分布式任务队列,它支持任务的异步执行.进度监控.重试机制等功能. Celery的核心组件包括: Broker:消息中间件,如RabbitMQ.用于任务的发布和订阅. ...

  2. #容斥,广搜#nssl 1458 HR的疑惑 nssl 1460 逛机房

    nssl 1458 HR的疑惑 题目 求\([1\sim n]\)中有多少个正整数\(x\)满足 \[\sqrt[y]{x}\in N^{+},y>1 \] 其中\(n\leq 10^{18}\ ...

  3. HTTP协议安全头部的笔记

    本文于2016年3月完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 近日项目组对当前开发.维护的Web系统做了AppScan扫描,扫描的结 ...

  4. Pandas高级教程之:Dataframe的重排和旋转

    目录 简介 使用Pivot 使用Stack 使用melt 使用Pivot tables 使用crosstab get_dummies 简介 使用Pandas的pivot方法可以将DF进行旋转变换,本文 ...

  5. OpenHarmony携千行百业创新成果亮相HDC.Together 2023

     8月4日-6日,华为开发者大会2023(以下简称"大会")在中国松山湖举办,OpenAtom OpenHarmony(简称"OpenHarmony")隆重参会 ...

  6. C++ 字符串完全指南:学习基础知识到掌握高级应用技巧

    C++ 字符串 字符串用于存储文本. 一个字符串变量包含由双引号括起来的一组字符: 示例 创建一个 string 类型的变量并为其赋值: string greeting = "Hello&q ...

  7. Spring Boot 嵌入式服务器、Hibernate 关系和 Spring Data 全解析

    嵌入式服务器 Spring Boot 的嵌入式服务器功能是一项方便而强大的功能,它允许你在应用程序中直接运行 Web 服务器,无需将其部署到单独的独立 Web 服务器中.这使得开发.测试和部署 Web ...

  8. 鸿蒙HarmonyOS实战-ArkUI组件(Menu)

    一.Menu组件 Menu组件是一种常见的用户界面(UI)控件,用于在移动应用程序中显示可选项列表.它通常由一系列链接或按钮组成,以帮助用户导航和选择所需的操作.Menu组件可以在水平或垂直方向上呈现 ...

  9. [CentOS]压缩+解压+打包命令大全

    [CentOS]压缩+解压+打包命令大全 --------------- .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注 ...

  10. centos 6.4下fdisk分区、格式化、挂载新硬盘

    centos 6.4下fdisk分区.格式化.挂载新硬盘 作者: cat 日期: 2013 年 9 月 10 日 发表评论 (0) 查看评论 1.# fdisk -l 查看当前磁盘信息,就会发现最下面 ...