20231112多校模拟T2
题目描述
给你下列7种形状,问恰好填满
后三种形状纯粹是出题人的恶趣味,
d用没有
做法一:暴力
不会
做法二:递推
定义:
- f[i] 为填满
的方格的方案数 - g[i] 为填满
的方格 不能被腰斩 的方案数
初步分析#
很容易得到, 当
且
当i为大于4的偶数时
进一步发现
然后可以得到递推式
前面一部分可用前缀和优化一下变为:
发现奇数项根本没有用,优化一下空间
此时答案为
进一步优化
至此,复杂度优化为
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项的平方
我太弱了不会推
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】