LOJ #10172. 「一本通 5.4 练习 1」涂抹果酱
题目描述
Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕。蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM 列的矩阵)。蛋糕很快做好了,但光秃秃的蛋糕肯定不好看!所以,Sam 要在蛋糕的上表面涂抹果酱。果酱有三种,分别是红果酱、绿果酱、蓝果酱,三种果酱的编号分别为 1,2,31,2,31,2,3。为了保证蛋糕的视觉效果,Admin 下达了死命令:相邻的区域严禁使用同种果酱。但 Sam 在接到这条命令之前,已经涂好了蛋糕第 KKK 行的果酱,且无法修改。
现在 Sam 想知道:能令 Admin 满意的涂果酱方案有多少种。请输出方案数 mod106。若不存在满足条件的方案,请输出 000。
输入格式
输入共三行。
第一行:N,MN, MN,M;
第二行:KKK;
第三行:MMM 个整数,表示第 KKK 行的方案。
字母的详细含义见题目描述,其他参见样例。
输出格式
输出仅一行,为可行的方案总数。
样例
样例输入
2 2
1
2 3
样例输出
3
样例说明
方案一 | 方案二 | 方案三 |
---|---|---|
2 3 1 2 |
2 3 3 1 |
2 3 3 2 |
数据范围与提示
对于 30% 的数据,1≤N×M≤20;
对于 60% 的数据,1≤N≤1000,1≤M≤3;
对于 100% 的数据,1≤N≤10000,1≤M≤5。
因为有3种果酱,所以用三进制表示,用dfs生成状态
状态不超过100
#include<cstdio>
#define ll long long
#include<iostream>
const int p=1e6;
using namespace std;
inline int read()
{int ret=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9')ret=(ret<<1)+(ret<<3)+ch-'0',ch=getchar();return ret;
}int n,m,k,cnt;
const int N=1e4+4,M=6,S=105;
int a[S],mi[M],c[M],f[N][S];inline bool check(int x,int y)
{int i=0;while(x||y){i++;if(x%3==y%3) return 0;x/=3,y/=3;}if(i<m) return 0;return 1;
}void dfs(int t,int s)
{if(t>m) {a[++cnt]=s;return;}if(s/mi[t-2]!=0) dfs(t+1,s);if(s/mi[t-2]!=1) dfs(t+1,s+mi[t-1]);if(s/mi[t-2]!=2) dfs(t+1,s+mi[t-1]+mi[t-1]);
}int main()
{n=read(),m=read(),k=read();mi[0]=1;for(int i=1;i<=m;i++) mi[i]=(mi[i-1]<<1)+mi[i-1];dfs(2,0); dfs(2,1); dfs(2,2);int x=0,loc=0;for(int i=1;i<=m;i++) x+=(read()-1)*mi[i-1];for(int i=1;i<=cnt;i++)if(a[i]==x) {loc=i; break;}if(!loc) {printf("0\n",0);return 0;}f[1][loc]=1;for(int i=2;i<=max(k,n-k+1);i++)for(int j=1;j<=cnt;j++)for(int k=1;k<=cnt;k++)if(check(a[j],a[k])) f[i][j]=(f[i][j]+f[i-1][k])%p;int ans=0;for(int i=1;i<=cnt;i++) ans=(ans+f[k][i])%p;int ss=0;for(int i=1;i<=cnt;i++) ss=(ss+f[n-k+1][i])%p;ans=(ll)ans*ss%p;printf("%d\n",ans);return 0;
}
LOJ #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的小正方形区域(可以把 ...
- #10172. 「一本通 5.4 练习 1」涂抹果酱 【 三进制状态压缩 】【 方案数 】
Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM 列的矩阵) ...
- Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)
题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...
- LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci
题目链接 题目大意 $$F[i]=F[i-1]+F[i-2]\ (\ F[1]=1\ ,\ F[2]=1\ )$$ $$T[i]=F[1]+2F[2]+3F[3]+...+nF[n]$$ 求$T[n] ...
- 数位dp(一)——Loj #10166. 「一本通 5.3 练习 1」数字游戏
题目链接:https://loj.ac/problem/10166 题目大意 求区间[a,b]有多少数字满足数位加和%N等于0. 解题思路 看范围,很明显的数位dp.我们设定状态dp[pos][N][ ...
- LOJ #10008. 「一本通 1.1 练习 4」家庭作业
智力大冲浪的数据加强版,n^2算法要被卡. 我们发现,原来的暴力代码最暴力的是这一段: for (register int j=num[i].pos; j>=1; --j) if (!f[j]) ...
- LOJ #10155. 「一本通 5.2 例 3」数字转换
无向图的最长链怎么求?和树的直径求法相同. #include <bits/stdc++.h> using namespace std; const int N=5e4+5; int n,a ...
- LOJ 10155. 「一本通 5.2 例 3」数字转换
题目:数字转换 思路: 对于每一个数,把它和它能够转移到的数之间连一条边. 由于不存在多元环,这个图本质上是一棵树. 然后在树上求最长链的长度就可以了. 具体实现就是dfs遍历整棵树,对于以每个点ii ...
最新文章
- g++代码编译用选项-O3前后对比,前后执行时间对比如下
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )
- 汇编中的LABEL详解
- 图像中添加二项式分布噪声
- Activemq实战
- 重命名myclipse中web项目名称的过程
- Oracle 从入门到精通视频教程(11G版本)
- python 标准库之os
- 笔记本显卡未连接计算机,电脑提示当前未使用连接到NVIDIA GPU的显示器如何解决...
- Java,Android 汉明窗 Hanmming
- 2. Ruby下载安装
- 腾讯笔试题编程题——纸牌游戏
- 软件测试可用性常用指标
- SageMath矩阵操作及解线性方程组
- 2019年个人成长计划
- 以太坊网络重启并开启rpc
- 工业控制电气非标自动化设计安装调试PLC编程电路电气外包行业的前景预测与分析
- c语言中%s的作用,C语言中%c,%s分别代表什么意思?
- matlab实习,matlab实习报告
- 西乡中学2021艺体生高考成绩查询,2019年西乡中学特长生评分标准
热门文章
- Xiaohe-LeetCode 237 Delete Node in a Linked List
- 计算机器件及设备毕业设计论文,毕业设计(论文)计算机科学与技术的应用领域简述论文.doc...
- Oracle查询部门工资最高员工的两种方法 1、MAX()函数 2、RANK()函数
- Vue进阶知识(2)
- 会自动化—10K,能做自动化—20K,你搞懂自动化测试没有?
- 使用kmplot在线进行生存分析
- RGBD模态融合问题
- ShengHuaOJ:A+B(用位运算噶)
- 【C++】ODA的基本操作-平移、旋转、矩阵变换
- 论文笔记:CQR-SQL: Conversational Question Reformulation Enhanced Context-Dependent Text-to-SQL Parsers