题目描述

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

  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的小正方形区域(可以把 ...

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

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

  4. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

  5. 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] ...

  6. 数位dp(一)——Loj #10166. 「一本通 5.3 练习 1」数字游戏

    题目链接:https://loj.ac/problem/10166 题目大意 求区间[a,b]有多少数字满足数位加和%N等于0. 解题思路 看范围,很明显的数位dp.我们设定状态dp[pos][N][ ...

  7. LOJ #10008. 「一本通 1.1 练习 4」家庭作业

    智力大冲浪的数据加强版,n^2算法要被卡. 我们发现,原来的暴力代码最暴力的是这一段: for (register int j=num[i].pos; j>=1; --j) if (!f[j]) ...

  8. LOJ #10155. 「一本通 5.2 例 3」数字转换

    无向图的最长链怎么求?和树的直径求法相同. #include <bits/stdc++.h> using namespace std; const int N=5e4+5; int n,a ...

  9. LOJ 10155. 「一本通 5.2 例 3」数字转换

    题目:数字转换 思路: 对于每一个数,把它和它能够转移到的数之间连一条边. 由于不存在多元环,这个图本质上是一棵树. 然后在树上求最长链的长度就可以了. 具体实现就是dfs遍历整棵树,对于以每个点ii ...

最新文章

  1. g++代码编译用选项-O3前后对比,前后执行时间对比如下
  2. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )
  3. 汇编中的LABEL详解
  4. 图像中添加二项式分布噪声
  5. Activemq实战
  6. 重命名myclipse中web项目名称的过程
  7. Oracle 从入门到精通视频教程(11G版本)
  8. python 标准库之os
  9. 笔记本显卡未连接计算机,电脑提示当前未使用连接到NVIDIA GPU的显示器如何解决...
  10. Java,Android 汉明窗 Hanmming
  11. 2. Ruby下载安装
  12. 腾讯笔试题编程题——纸牌游戏
  13. 软件测试可用性常用指标
  14. SageMath矩阵操作及解线性方程组
  15. 2019年个人成长计划
  16. 以太坊网络重启并开启rpc
  17. 工业控制电气非标自动化设计安装调试PLC编程电路电气外包行业的前景预测与分析
  18. c语言中%s的作用,C语言中%c,%s分别代表什么意思?
  19. matlab实习,matlab实习报告
  20. 西乡中学2021艺体生高考成绩查询,2019年西乡中学特长生评分标准

热门文章

  1. Xiaohe-LeetCode 237 Delete Node in a Linked List
  2. 计算机器件及设备毕业设计论文,毕业设计(论文)计算机科学与技术的应用领域简述论文.doc...
  3. Oracle查询部门工资最高员工的两种方法 1、MAX()函数 2、RANK()函数
  4. Vue进阶知识(2)
  5. 会自动化—10K,能做自动化—20K,你搞懂自动化测试没有?
  6. 使用kmplot在线进行生存分析
  7. RGBD模态融合问题
  8. ShengHuaOJ:A+B(用位运算噶)
  9. 【C++】ODA的基本操作-平移、旋转、矩阵变换
  10. 论文笔记:CQR-SQL: Conversational Question Reformulation Enhanced Context-Dependent Text-to-SQL Parsers