#10172. 「一本通 5.4 练习 1」涂抹果酱 题解
题目链接
一道三进制状压的好题。
题目描述:
Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕。蛋糕俯视图是一个 N×M的矩形,它被划分成 N×M个边长为 1×1的小正方形区域(可以把蛋糕当成 N 行 M 列的矩阵)。蛋糕很快做好了,但光秃秃的蛋糕肯定不好看!所以,Sam 要在蛋糕的上表面涂抹果酱。果酱有三种,分别是红果酱、绿果酱、蓝果酱,三种果酱的编号分别为 1,2,3.为了保证蛋糕的视觉效果,Admin 下达了死命令:相邻的区域严禁使用同种果酱。但 Sam 在接到这条命令之前,已经涂好了蛋糕第 KKK 行的果酱,且无法修改。 现在 Sam 想知道:能令 Admin 满意的涂果酱方案有多少种。请输出方案数 mod1e6。若不存在满足条件的方案,请输出 0。
输入格式
输入共三行。
第一行:N,M;
第二行:K;
第三行:M 个整数,表示第 K 行的方案。
字母的详细含义见题目描述,其他参见样例。
输出格式
输出仅一行,为可行的方案总数。
样例
样例输入
2 2 1 2 3
样例输出
3
解题思路:
这道题关键在判断合法情况,第k行特判一下即可。
1.判断一个三进制数是否有相同数字相邻的情况,不能模拟二进制左移右移的情况,
因为这里有3个数字,左移右移会出现有0的影响。
2.判断不同行是否有相同数字相邻,模拟二进制的&判断一下即可。
代码:
#include<bits/stdc++.h> #define ll long long #define R register using namespace std; int n,m,k,mod=1e6,a[250],sk,num,top,ans,f[10005][250]; inline int ksm(R int x,R int p) {R int tot=1;while(p){if(p&1){tot=tot*x;}x=x*x;p>>=1;}return tot; } inline int check(R int x,R int y) {for(R int i=1;i<=m;++i){if((x%3)==(y%3))return 0;x/=3;y/=3;}return 1; } inline int judge(R int x) {R int y=-1;for(R int i=1;i<=m;++i){ if(y==x%3)return 0;y=x%3;x/=3;}return 1; } inline void init() {for(R int i=0;i<=242;++i){R int x=i,tot=0;while(x){x/=3;++tot;}if(tot>=m+1)break;if(judge(i)){ a[++num]=i; if(i==sk)top=num;}} } int main(){scanf("%d%d",&n,&m);scanf("%d",&k);for(R int i=1;i<=m;++i){R int t;scanf("%d",&t);sk+=(t-1)*ksm(3,i-1);}if(!judge(sk)) {printf("0");return 0;}init();if(k==1)f[1][top]=1;elsefor(R int i=1;i<=num;++i)f[1][i]=1;for(R int i=2;i<=n;++i)//当前第几行 {if(i==k){for(R int t=1;t<=num;++t)if(check(a[top],a[t]))f[i][top]=(f[i][top]+f[i-1][t])%mod;}else{for(R int j=1;j<=num;++j)//当前行状态 {if(i-1==k){if(check(a[j],a[top]))f[i][j]=(f[i][j]+f[i-1][top])%mod;}else{for(R int t=1;t<=num;++t)//上一行状态if(check(a[j],a[t]))f[i][j]=(f[i][j]+f[i-1][t])%mod;}}}}for(R int i=1;i<=num;++i)ans=(ans+f[n][i])%mod;printf("%d",ans%mod);return 0; }
这道题关键在于舍弃不合法情况的判断.
转载于:https://www.cnblogs.com/sky-zxz/p/9865604.html
#10172. 「一本通 5.4 练习 1」涂抹果酱 题解相关推荐
- LOJ#10172. 「一本通 5.4 练习 1」涂抹果酱
题目链接:https://loj.ac/problem/10172 题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×MN×MN×M 的矩形,它被划分成 ...
- #10172. 「一本通 5.4 练习 1」涂抹果酱 【 三进制状态压缩 】【 方案数 】
Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM 列的矩阵) ...
- LOJ #10172. 「一本通 5.4 练习 1」涂抹果酱
题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM ...
- 「一本通 6.5 练习 3」迷路
「一本通 6.5 练习 3」迷路 题目描述 大意说一个给你有向图, 一个有n个节点,每个节点相连的边为所需要花费的时间, 问你从1到n 在时间刚好为t是的方案数.输出%2009 注意:不能在某个节点逗 ...
- 【C++】「一本通 1.1 例 4」加工生产调度
「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...
- LibreOJ10082. 「一本通 3.3 例 1」Word Rings【二分+SPFA】
10082. 「一本通 3.3 例 1」Word Rings [题目描述] 传送门 [题解] 将一个字符串看成一条边,字符两端的字符看成节点,长度看成权值.二分枚举答案,最后SPFA刷正环,因为只要有 ...
- #10016. 「一本通 1.2 练习 3」灯泡(三分)
参考博客链接:「一本通 1.2 练习 3」灯泡(三分) #include<stdio.h> #include<string.h> #include<math.h> ...
- 【C++】「一本通 1.1 例 2」种树
「一本通 1.1 例 2」种树 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [解析] [代码] [来源] 一本通题库-1423 LibreOJ-10001 vjud ...
- #10001. 「一本通 1.1 例 2」种树
#10001. 「一本通 1.1 例 2」种树 满足n个区间种树的要求,求最少种多少棵数 思路 按照区间的尾巴来排序,因为如果区间有重叠的种在第一个区间的尾巴可以使得种树更少,所有每次始从尾巴开始种树 ...
最新文章
- java编译的语句_在Java语言中,下列语句能通过编译的是()。
- 九十分钟极速入门Linux——Linux Guide for Developments 学习笔记
- 腾讯AI Lab推进医疗全流程覆盖:辅诊导诊精度再升级、布局三类病理AI研究
- RabbitMQ(三) ——发布订阅
- cors跨域_Spring Boot 中通过 CORS 解决跨域问题
- 【OpenGL】OpenGL视图和模型变换中各变换发生顺序的思考
- 使用jfreechart来创建一个简单的饼图
- 法向量 点云pca_CVPR 2019 | 旷视研究院Oral论文提出GeoNet:基于测地距离的点云分析深度网络...
- 区块链网络安全平台HAPI获Genesis Block Ventures投资
- 审查元素找不到创建的元素_面试被问:Selenium元素定位不到问题,如何回答?...
- echolife hg8245说明书_华为光猫HG8245设置说明书
- 单点登录cas常见问题系列汇总
- 人人网主页登录_“人人”归来!有人想找前女友,有人想删“黑历史”
- 甲醛测量仪 DART WZ-S + stm32f103c + stmDuino IDE + I2C OLED
- 中科大自主招生2018年笔试数学之四
- 寒假水67——空心三角形
- 计算机网络------虚拟局域网
- 一、ECharts(各种统计图)
- python excel 内容写入html,PYTHON读取EXCEL内容再转变成HTML添加到OUTLOOK中
- windows下批处理删除文件夹、删除文件、if exist用法
热门文章
- Spartan-6 FPGA SelectIO Resources User Guide 笔记2 SelectIO Attributes/Constraints
- C语言宏定义##连接符和#符的使用及其它宏定义注意事项
- Android SDK 2.3/3.0/4.0/4.2 下载与安装教程
- 前端学习总结——CSS布局方式之传统布局
- koa --- mongoose连接mongoDB
- javascript --- 数组实用小技巧
- (水一下)Linux启动步骤(面试题)
- Python 基础(常用数据结构)
- 一、Java语言基础(4)_方法和数组——数组
- 跳過 Windows RT的UI