2019 HNCPC D Modulo Nine 数位DP
题意
给定长度n和m个限制(l,r),每一个限制的意义是\(a_l \times a_{l+1} \times ... a_r = 0 \quad mod\ 9\)。
问有多少个满足所有条件且长度为n的10进制数(可以包含前导0)
解题思路
看到可以包含前导零的时候就想到了数位DP,但是比赛的时候没想出怎么记录状态来记忆化搜索。赛后听ljn讲了之后秒懂,我还是太菜了。
模9为0可以分为3种情况:区间内9的个数大于等于1,0的个数大于等于1,或,3的个数+6的个数大于等于2,所以可以用4维数组\(dp_{pos,last09,last36,second36}\)来记录状态
\(dp_{pos,last09,last36,second36}\):pos表示当前枚举到了第几位,last09表示前一个0或9的下标,last36表示前一个3或6的下标,second36表示last36往前一个3或6的下标。
然后按当前位为0或9,3或6,其他数字分类讨论,如果满足以pos为右端点的所有限制就继续转移。
代码实现
和叉姐的标称对拍没有出错,应该是对的吧
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const int mod=1e9+7;
int n,m;
int dp[55][55][55][55];//pos 09 36-1 36-2
vector<int>limit[55];
ll dfs(int pos,int last_09,int last_36,int second_36){
if(pos==n+1)return 1;
if(dp[pos][last_09][last_36][second_36]!=-1)return dp[pos][last_09][last_36][second_36];
ll res=0;
for(int i=0;i<=9;i++){//枚举当前位
if(i==0 || i==9){
res=(res+dfs(pos+1,pos,last_36,second_36))%mod;
}
else if(i==3 || i==6){
bool flag=true;
for(int l:limit[pos]){
if(last_09>=l)continue;
if(last_36>=l)continue;
flag=false;
}
if(flag)res=(res+dfs(pos+1,last_09,pos,last_36))%mod;
}
else{
bool flag=true;
for(int l:limit[pos]){
if(last_09>=l)continue;
if(second_36>=l)continue;
flag=false;
}
if(flag)res=(res+dfs(pos+1,last_09,last_36,second_36))%mod;
}
}
dp[pos][last_09][last_36][second_36]=res;
return res;
}
ll f(){
memset(dp,-1,sizeof(dp));
return dfs(1,-1,-1,-1);
}
int main()
{
while(~scanf("%d %d",&n,&m)){
int l,r;
for(int i=1;i<=n;i++)limit[i].clear();
for(int i=1;i<=m;i++){
scanf("%d %d",&l,&r);
limit[r].push_back(l);
}
printf("%lld\n",f());
}
return 0;
}
2019 HNCPC D Modulo Nine 数位DP的更多相关文章
- ExaWizards 2019 English D - Modulo Operations(DP)
Time Limit: 2 sec / Memory Limit: 1024 MB Score : 600600 points Problem Statement Snuke has a blackb ...
- 【2019.7.20 NOIP模拟赛 T2】B(B)(数位DP)
数位\(DP\) 首先考虑二进制数\(G(i)\)的一些性质: \(G(i)\)不可能有连续两位第\(x\)位和第\(x+1\)位都是\(1\).因为这样就可以进位到第\(x+2\)位.其余情况下,这 ...
- Pair(二进制处理+数位dp)(2019牛客暑期多校训练营(第七场))
示例: 输入: 33 4 24 5 27 8 5 输出:5 7 31 题意:存在多少对<x,y>满足x&y>C或x^y<C的条件.(0<x<=A,0< ...
- 华东交通大学 2019 I 不要666 数位dp进阶
Problem Description 题库链接 666是一个网络用语,用来形容某人或某物很厉害很牛.而在西方,666指魔鬼,撒旦和灵魂,是不吉利的象征.所以邓志聪并不喜欢任何与6有关的数字.什么数字 ...
- 2019牛客暑期多校训练营(第七场)-H Pair(数位dp)
题目链接:https://ac.nowcoder.com/acm/contest/887/H 题意:给定A,B,C,求有多少对(x,y)满足x&y>C或者x^y<C,其中1< ...
- 2019年9月训练(壹)数位DP (HDU 2089)
开学之后完全没时间写博客.... HDU 2089 不要62(vjudge) 数位DP 思路: 题目给出区间[n,m] ,找出不含4或62的数的个数 用一个简单的差分:先求0~m+1的个数,再减去0~ ...
- 2019长安大学ACM校赛网络同步赛 L XOR (规律,数位DP)
链接:https://ac.nowcoder.com/acm/contest/897/L 来源:牛客网 XOR 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- 2019牛客多校第七场H Pair 数位DP
题意:给你一个3个数A, B, C问有多少对pair(i, j),1 <= i <= A, 1 <= j <= B, i AND j > C或 i XOR j < ...
- 【NOI2019模拟2019.6.29】组合数(Lucas定理、数位dp)
Description: p<=10且p是质数,n<=7,l,r<=1e18 题解: Lucas定理: \(C_{n}^m=C_{n~mod~p}^{m~mod~p}*C_{n/p} ...
随机推荐
- “随手记”开发记录day19
将软件推荐给父母,先尝试使用软件,观察bug,若有啥不足的,才能及时修改.
- 阿里ECS云服务器部署文件
今天,接触了阿里ECS云服务器,免费领取链接https://dwz.cn/WOFZpZz1 获取之后,要添加一下端口,刚开始需要80 8080 3306的端口,其他的根据需要自行添加 点击快速创建 ...
- Python预测2020高考分数和录取情况
“迟到”了一个月的高考终于要来了. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识. ...
- 1、迭代器 Iterator模式 一个一个遍历 行为型设计模式
1.Iterator模式 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或者阵列)上遍访的接口,设计人员无需关心容器的内容. I ...
- 最火热的极速开发框架Spring Boot
Spring Boot是Spring家族中的一个全新的框架,它用来简化Spring应用程序的创建和开发过程,也可以说Spring Boot能简化我们之前采用Spring mvc + Spring + ...
- CSS卡片右上角标记样式设计
template <div class="each-one-in-list"> <div class="show-icon">进行中&l ...
- VUE——添加组件模块(图表)
Vue是由一个个小模块组成的,模块可以让页面简介还可以复用: 1.不固定数据数量传到子组件 父组件: <chartVue v-for="(item, index) in chartLi ...
- day3 基本语句
代码缩进为一个tab键 就是四个空格 断点 在代码首行前空白处,双击 然后点右上角臭虫 然后点下面箭头朝下的 1.if 语句 if 判断条件: ...
- PDF的来源——概率密度函数
//首发于简书,详见原文:https://www.jianshu.com/p/6493edd20d61 你不会还真的以为这是一篇讲怎么做pdf文件,怎么编辑.保存.美化的文章吧? 咳咳,很遗憾告诉你不 ...
- 谈谈javascript的基本规范~~~~
1.不要在同一行声明多个变量. 2.请使用===或==来比较true或false或者数值 3.使用对象字面量代替new Array这种形式 4.不要使用全局函数 5.switch语句必须带有defau ...