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} ...
随机推荐
- Android——对话框的全部内容。(课堂总结)
前面的总结是写过对话框的,但是那只是冰山一角,简单的创建和使用罢了. 今天具体讲下AlertDialog. 首先对话框不需要在布局里写,在活动里new出来的. AlertDialog.Builder ...
- 群晖系统如何通过Video Station套件管理NAS中的视频
一.PC端观看视频 1.在NAS套件中心找到Video Station套件,安装套件 2.设置video套件别名,便于后期使用,控制面板----应用程序门户----video Station 3.选中 ...
- Linux学习笔记之linux软件包安装以及源的替换
先是软件源的替换,在刚安装的Ubuntu中会配有原先的软件源,所以如果要替换时,可在网上找与自己ubuntu相对应的软件源,比如我的ubuntu版本为12.04,所以我得找到相对应能够适用Ubuntu ...
- 15、Facade 外观模式
什么是Facade模式 随着系统越来越复杂,我们需要把细节隐藏起来,给客户端提供一个统一的接口.在这种需求下facade模式诞生了.该模式比较简单,我们只需要在系统变得复杂把它运用上来,这样底层跟客户 ...
- 微信公众号添加word文件
微信公众号添加word文件的教程 我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. 以下是公众 ...
- 1)uboot的编译和烧写
购买荔枝派ZERO已经将近一个星期了,由于官方资料不够完整一直没有任何进展.经过今夜近三个小时的折腾终于将UBOOT烧写成功,现将过程记录如下: 1)获取官方uboot 源码 : git clone ...
- Bytom Dapp 开发笔记(一):架构设计
简介 研究比原链已经一年了,用比原链做了几个dapp,而且最近还做了一个基于他们插件钱包的dapp,总结了一些遇到的坑,还有一些技术细节,接下来我会分成三章,从dapp设计架构上,到深入到源码分析去帮 ...
- Vercel托管博客
背景 本站已托管至Vercel,但作为一名前端小白,昨天帮朋友托管博客到Vercel的过程中到处碰壁,就想写一篇博客记录一下. 注册登录 点击Vercel官网{% btn 'https://verce ...
- 【luogu1352】没有上司的舞会 - 树形DP
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- 深度优先搜索(dfs)与出题感想
在3月23号的广度优先搜索(bfs)博客里,我有提到写一篇深搜博客,今天来把这个坑填上. 第一部分:深度优先搜索(dfs) 以上来自百度百科. 简单来说,深度优先搜索算法就是——穷举法,即枚举所有情况 ...