题目链接

一道三进制状压的好题。

题目描述:

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」涂抹果酱 题解相关推荐

  1. LOJ#10172. 「一本通 5.4 练习 1」涂抹果酱

    题目链接:https://loj.ac/problem/10172 题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×MN×MN×M 的矩形,它被划分成 ...

  2. #10172. 「一本通 5.4 练习 1」涂抹果酱 【 三进制状态压缩 】【 方案数 】

    Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM 列的矩阵) ...

  3. LOJ #10172. 「一本通 5.4 练习 1」涂抹果酱

    题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM  ...

  4. 「一本通 6.5 练习 3」迷路

    「一本通 6.5 练习 3」迷路 题目描述 大意说一个给你有向图, 一个有n个节点,每个节点相连的边为所需要花费的时间, 问你从1到n 在时间刚好为t是的方案数.输出%2009 注意:不能在某个节点逗 ...

  5. 【C++】「一本通 1.1 例 4」加工生产调度

    「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...

  6. LibreOJ10082. 「一本通 3.3 例 1」Word Rings【二分+SPFA】

    10082. 「一本通 3.3 例 1」Word Rings [题目描述] 传送门 [题解] 将一个字符串看成一条边,字符两端的字符看成节点,长度看成权值.二分枚举答案,最后SPFA刷正环,因为只要有 ...

  7. #10016. 「一本通 1.2 练习 3」灯泡(三分)

    参考博客链接:「一本通 1.2 练习 3」灯泡(三分) #include<stdio.h> #include<string.h> #include<math.h> ...

  8. 【C++】「一本通 1.1 例 2」种树

    「一本通 1.1 例 2」种树 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [解析] [代码] [来源] 一本通题库-1423 LibreOJ-10001 vjud ...

  9. #10001. 「一本通 1.1 例 2」种树

    #10001. 「一本通 1.1 例 2」种树 满足n个区间种树的要求,求最少种多少棵数 思路 按照区间的尾巴来排序,因为如果区间有重叠的种在第一个区间的尾巴可以使得种树更少,所有每次始从尾巴开始种树 ...

最新文章

  1. java编译的语句_在Java语言中,下列语句能通过编译的是()。
  2. 九十分钟极速入门Linux——Linux Guide for Developments 学习笔记
  3. 腾讯AI Lab推进医疗全流程覆盖:辅诊导诊精度再升级、布局三类病理AI研究
  4. RabbitMQ(三) ——发布订阅
  5. cors跨域_Spring Boot 中通过 CORS 解决跨域问题
  6. 【OpenGL】OpenGL视图和模型变换中各变换发生顺序的思考
  7. 使用jfreechart来创建一个简单的饼图
  8. 法向量 点云pca_CVPR 2019 | 旷视研究院Oral论文提出GeoNet:基于测地距离的点云分析深度网络...
  9. 区块链网络安全平台HAPI获Genesis Block Ventures投资
  10. 审查元素找不到创建的元素_面试被问:Selenium元素定位不到问题,如何回答?...
  11. echolife hg8245说明书_华为光猫HG8245设置说明书
  12. 单点登录cas常见问题系列汇总
  13. 人人网主页登录_“人人”归来!有人想找前女友,有人想删“黑历史”
  14. 甲醛测量仪 DART WZ-S + stm32f103c + stmDuino IDE + I2C OLED
  15. 中科大自主招生2018年笔试数学之四
  16. 寒假水67——空心三角形
  17. 计算机网络------虚拟局域网
  18. 一、ECharts(各种统计图)
  19. python excel 内容写入html,PYTHON读取EXCEL内容再转变成HTML添加到OUTLOOK中
  20. windows下批处理删除文件夹、删除文件、if exist用法

热门文章

  1. Spartan-6 FPGA SelectIO Resources User Guide 笔记2 SelectIO Attributes/Constraints
  2. C语言宏定义##连接符和#符的使用及其它宏定义注意事项
  3. Android SDK 2.3/3.0/4.0/4.2 下载与安装教程
  4. 前端学习总结——CSS布局方式之传统布局
  5. koa --- mongoose连接mongoDB
  6. javascript --- 数组实用小技巧
  7. (水一下)Linux启动步骤(面试题)
  8. Python 基础(常用数据结构)
  9. 一、Java语言基础(4)_方法和数组——数组
  10. 跳過 Windows RT的UI