当前位置: 首页 > news >正文

题解:P15220 [SWERC 2017] Macarons

经典的状态 DP 结合矩阵快速幂题。

  1. \(N \le 8\),我们可以状态压缩。每一列最多只有 \(2^8 = 256\) 种状态。
  2. \(M \le 10^{18}\),我们可以将转移方程构建成一个转移矩阵,用矩阵快速幂在 \(O(\log M)\) 的复杂度内求解。

我们按列从左到右填。对于第 \(i\) 列,我们定义一个 \(N\) 位的二进制数 \(S\)

  • 如果 \(S\) 的第 \(j\) 位为 \(1\),表示第 \(i\) 列的第 \(j\) 行被前一列 \(1 \times 2\) 延伸过来占用了。
  • 如果 \(S\) 的第 \(j\) 位为 \(0\),表示第 \(i\) 列的第 \(j\) 行是空的,需要我们在当前列去填充。

设当前列的初始状态为 \(S\),我们需要填满当前列的空位,并推导出对下一列的初始状态 \(T\)

  1. \(S\) 对应位为 \(1\),即当前格子已经被占用,什么都不能放,对应 \(T\) 的这一位一定为 \(0\)
  2. \(S\) 对应位为 \(0\),即当前格子是空的,我们必须把它填满,有 \(3\) 种选择:
    • \(2 \times 1\)(条件是当前格子和它下面的格子都是空的):占用当前格子和它下面的格子。这两个格子都不会延伸到下一列,对应 \(T\) 的这一位和下一位都是 \(0\)
    • \(1 \times 2\):占用当前格子和下一列的同一个格子,对应 \(T\) 的这一位为 \(1\)
    • \(1 \times 1\):占用当前格子,对应 \(T\) 的这一位为 \(0\)

转移矩阵可以预处理。

答案是 \(M^N[0][0]\)

:::info[Code]

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1<<8;
const int mod=1e9;
struct matrix{int n,m;int a[N][N];matrix(){n=m=0;memset(a,0,sizeof(a));return;}void idtt(){memset(a,0,sizeof(a));for(int i=0;i<n;i++)a[i][i]=1;return;}void print(){for(int i=0;i<n;i++,cout<<'\n')for(int j=0;j<m;j++)cout<<a[i][j]<<' ';return;}
}g;
matrix operator * (const matrix& x,const matrix& y){assert(x.m==y.n);matrix res;res.n=x.n,res.m=y.m;for(int k=0;k<x.m;k++)for(int i=0;i<x.n;i++)for(int j=0;j<y.m;j++)res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j])%mod;return res;
}
matrix qpow(matrix x,int y){matrix res=x;res.idtt();while(y){if(y&1)	res=res*x;x=x*x;y>>=1;}return res;
}
int n,m;
signed main(){// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n>>m;g.n=g.m=(1<<n);for(int i=0;i<(1<<n);i++){vector<int> nxt(1),to;for(int j=0;j<n;j++){if(i&(1<<j))continue;vector<int> nw;nw.swap(to);for(int u:nxt){if(j+1<n&&(i&(1<<(j+1)))==0)to.push_back(u);nw.push_back(u+(1<<j));nw.push_back(u);}nxt.swap(nw);}for(int u:nxt)g.a[i][u]++;}// g.print();cout<<qpow(g,m).a[0][0];return 0;
}

:::

http://www.jsqmd.com/news/866769/

相关文章:

  • 通过TaotokenCLI工具一键配置多开发环境下的AI模型调用参数
  • Go语言Web应用部署与运维实战
  • 收藏 | 程序员小白必看:解码Transformer核心模块,轻松入门大模型底层逻辑
  • 2026年全屋定制厂家推荐排行榜:电视柜、餐边柜、鞋柜等各类定制柜,专业生产与品质之选! - 资讯纵览
  • 你的知识库还在用关键词搜索?2026年必须升级的3类向量-图-推理混合引擎(附迁移成本测算表)
  • 2026做GEO优化必避的行业乱象!专业平台剪流GEO规避所有风险 - 资讯纵览
  • Java 集合反序列化漏洞如何修复避免远程代码执行风险
  • Paladin Anim Set深度调优:Unity战斗系统动画集成指南
  • Unity版本降级实战:跨版本兼容性修复指南
  • 十大排序算法Python实现与可视化:从原理到工程实践
  • 工厂数据看板是什么?有什么推荐?
  • Agent Skills 到底解决了什么,又没解决什么?
  • 2026年报考指南:重庆工程学院的校园环境及设施怎么样? - 品牌2025
  • 题解:P15402 [NOISG 2026 Prelim] Digits
  • 大型SaaS系统数据范围权限设计:从RBAC到动态数据域的实战解析
  • 论服务网格(Istio/Linkerd)在微服务治理中的应用
  • AI经济学:倒置的价值链
  • 2026年CNAS资质咨询机构推荐:专业CNAS资质辅导机构实力解析 - 资讯纵览
  • RISC-V开发板GPIO点灯实战:从环境搭建到RT-Thread驱动编程
  • Go Web中间件机制深度剖析与实战
  • 2026失效分析:解读制造业三大核心趋势 - 资讯纵览
  • Wren AI革新:让AI智能体成为世界级数据分析师的开放上下文层
  • 对抗性深度强化学习在自动驾驶可靠性评估中的实践
  • Quark卡片电脑:极致迷你的Linux系统与嵌入式开发实战
  • SaaS系统数据范围权限设计:从RBAC/ABAC到高性能实现
  • 现在不部署DeepSeek到百度智能云,3个月后将无法接入文心一言生态?深度解析BFE网关策略变更倒计时
  • 无锡中小型企业抖音运营服务实测:三家本土机构能力解析 - 资讯纵览
  • 大模型岗位傻傻分不清?收藏这份指南,小白也能轻松入行!
  • Linux字符设备驱动开发:从内核注册到/dev节点创建的完整实践
  • AI爬虫洪流防御实战:四套神级反爬武器详解