题目描述

给你下列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. 《Spring6核心源码解析》已完结,涵盖IOC容器、AOP切面、AOT预编译、SpringMVC,面试杠杠的!

    作者:冰河 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://g ...

  2. 一文讲透Java核心技术之高可扩展利器SPI

    大家好,我是冰河~~ SPI的概念 JAVA SPI = 基于接口的编程+策略模式+配置文件 的动态加载机制 SPI的使用场景 Java是一种面向对象语言,虽然Java8开始支持函数式编程和Strea ...

  3. MobileNext:打破常规,依图逆向改造inverted residual block | ECCV 2020

    论文深入分析了inverted residual block的设计理念和缺点,提出更适合轻量级网络的sandglass block,基于该结构搭建的MobileNext.根据论文的实验结果,Mobil ...

  4. Python---time对象的使用获取时间

    https://www.jb51.net/article/49326.htm 1.time.time() 它返回当前时间的时间戳(1970纪元后经过的浮点秒数). 如果调用这个函数,如:  print ...

  5. 【已解决】(MySQL)SQL注入绕过登陆验证直接登陆---用户名输入框注释sql密码语句段

    今天学习了一种sql注入方法,通过注释密码验证部分的sql语句. 这是登陆界面 在用户名如果输入 15284206891' and 1=1 # 密码可以随意输入即可登陆成功 原理如下: 在sql可视化 ...

  6. 欢迎体验BotBattle!

    目录 1.常规游玩 2.快速开始 3.规则介绍 3.推荐的示例代码 1.常规游玩 前往复制 最基础代码 到剪切板 这有助于您开始游戏,且对于您熟悉 Bot 代码的 I/O 进而创建其他 bot 很有意 ...

  7. #双指针#洛谷 7521 [省选联考 2021 B 卷] 取模

    题目传送门 分析 将 \(a\) 排序后从大到小枚举 \(a_k\),注意枚举的时候重复的只考虑一次,那么可以将其它数按照模 \(a_k\) 后排序, 答案只可能来自最大值与次大值之和取模或者之和最接 ...

  8. C++执行Linux命令

    一.执行简单命令 比如需要创建文件.文件夹.删除文件 #include <iostream> #include <stdio.h> #include <stdlib.h& ...

  9. 鸿蒙HarmonyOS实战-ArkUI组件(Popup)

    一.Popup Popup组件通常用于在屏幕上弹出一个对话框或者浮动窗口.这个组件通常和其他组件一起用于用户界面的交互和反馈. Popup组件可以包含任何类型的组件或内容,比如文本.按钮.输入框.图片 ...

  10. Harbor仓库高可用

    一.搭建两台Harbor 搭建方法参考:https://www.cnblogs.com/hanfuming/p/15750031.html 二.两台新建相同项目 三.第二台harbor上仓库管理中新建 ...