Portal

Description

给出两个十一位数\(L,R\),求\([L,R]\)内所有满足以下两个条件的数的个数。

  • 出现至少\(3\)个相邻的相同数字;
  • 不能同时出现\(4\)和\(8\)。

Solution

数位DP。

首先将问题转换成\(solve(R)-solve(L)\)的形式,这样只需要求不超过\(n\)的满足条件的数的个数。

定义\(dp[k][x][f_1][f_2][f_3][f_4]\),其中\(k\)表示位数,\(x\)表示尾数,\(f_1\)表示第\(k\)位与第\(k-1\)位是否相同,\(f_2\)表示是否出现过三连,\(f_3\)表示\(4,8\)的出现情况(\(00,01,10,11\)),\(f_4\)表示是否在第\(k\)达到上限。

考虑第\(k+1\)位的每种取值\(i\)。若\(i=x\),则\(f_1=1\);若已有三连或原\(f_1=1\)且\(i=x\),则\(f_2=1\);若\(i\)等于\(4\)或\(8\),改变\(f_3\);若在第\(k\)位就达到上限且\(i\)等于n的第\(k+1\)位,则\(f_4=1\)。

用队列进行转移或循环每一维即可解决。

时间复杂度\(O(11×10×2×2×4×2\cdot10)\)。

Code

//「CQOI2016」手机号码
#include <cstdio>
#include <cstring>
#include <queue>
typedef long long lint;
struct state
{
int k,x,f1,f2,f3,f4;
state(int _k,int _x,int _f1,int _f2,int _f3,int _f4) {k=_k,x=_x,f1=_f1,f2=_f2,f3=_f3,f4=_f4;}
};
const int LEN=11;
lint dp[12][10][2][2][4][2];
std::queue<state> Q;
int is48(int x) {return (x==8)<<1|(x==4);}
lint solve(lint n)
{
memset(dp,0,sizeof dp);
int v[12];
for(lint i=LEN,t=n;i>=1;i--,t/=10) v[i]=t%10;
for(int i=1;i<=v[1];i++)
{
int f3=is48(i),f4=(i==v[1]);
dp[1][i][0][0][f3][f4]=1;
Q.push(state(1,i,0,0,f3,f4));
}
while(!Q.empty())
{
state s=Q.front(); Q.pop();
int k=s.k,x=s.x,f1=s.f1,f2=s.f2,f3=s.f3,f4=s.f4,val=dp[k][x][f1][f2][f3][f4];
if(k==LEN) continue;
int t=f4?v[k+1]:9;
for(int i=0;i<=t;i++)
{
int _f1=(i==x),_f2=f2||f1&&(i==x),_f3=f3|is48(i),_f4=f4&&i==t;
lint &r=dp[k+1][i][_f1][_f2][_f3][_f4];
if(!r) Q.push(state(k+1,i,_f1,_f2,_f3,_f4));
r+=val;
}
}
lint r=0;
for(int i=0;i<=9;i++)
for(int _f1=0;_f1<=1;_f1++)
for(int _f3=0;_f3<=2;_f3++)
r+=dp[LEN][i][_f1][1][_f3][0]+dp[LEN][i][_f1][1][_f3][1];
return r;
}
int main()
{
lint L,R;
scanf("%lld%lld",&L,&R);
if(L==(lint)1e10) printf("%lld\n",solve(R)-solve(L)+1);
else printf("%lld\n",solve(R)-solve(L-1));
return 0;
}

LibreOJ2044 - 「CQOI2016」手机号码的更多相关文章

  1. loj #2044. 「CQOI2016」手机号码

    #2044. 「CQOI2016」手机号码 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  2. loj2044 「CQOI2016」手机号码

    ref #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...

  3. LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree

    2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  4. LibreOJ2043 - 「CQOI2016」K 远点对

    Portal Description 给出平面上的\(n(n\leq10^5)\)个整点,求在欧几里得距离下第\(k\)远的点对之间的距离. Solution k-d树+堆. 用小根堆维护当前找到的第 ...

  5. LibreOJ2045 - 「CQOI2016」密钥破解

    Portal Description 给出三个正整数\(e,N,c(\leq2^{62})\).已知\(N\)能表示成\(p\cdot q\)的形式,其中\(p,q\)为质数.计算\(r=(p-1)( ...

  6. LibreOJ2042 - 「CQOI2016」不同的最小割

    Portal Description 给出一个给出一个\(n(n\leq850)\)个点\(m(m\leq8500)\)条边的无向图.定义\(cut(s,t)\)等于\(s,t\)的最小割的容量,求在 ...

  7. 「CQOI2016」不同的最小割

    「CQOI2016」不同的最小割 传送门 建出最小割树,把每一个点对的最小割抠出来 \(\text{unique}\) 一下就好了. 参考代码: #include <algorithm> ...

  8. 「CQOI2016」K 远点对

    /* 考虑暴力 可以n ^ 2枚举点对 然后用一个容量为2k的小根堆来维护第k大 kd-tree呢就是来将这个暴力优化, 每次先找远的并且最远距离不如堆顶的话就不继续找下去 貌似挺难构造数据卡的 */ ...

  9. 【LOJ】#2047. 「CQOI2016」伪光滑数

    题解 可持久化可并堆 用\(f[i,j]\)表示最大的质数标号为i,然后有j个质数乘起来 用\(g[i,j]\)表示\(\sum_{k = 1}^{i}f[k,j]\) 转移是 \(f[i,j] = ...

随机推荐

  1. Python 模块(二)

    1 logging 模块 logging有两种的配置的方式,configure.logger 1.1 config方式 import logging ''' 日志的配置:config模式 只能选择在屏 ...

  2. webgis技术在智慧城市综合治理(9+X)网格化社会管理平台(综治平台)的应用研究

    综治中心9+X网格化社会管理平台 为落实中央关于加强创新社会治理的要求,适应国家治理体系和治理能力现代化要求,以基层党组织为核心,以整合资源.理顺关系.健全机制.发挥作用为目标,规范街道.社区综治中心 ...

  3. 【Mysql】Mysql主从库搭建过程(爬完坑后整理所得)

    Mysql主从数据库搭建流程 新手开始学习mysql主从库,遇到一些问题,总结后写出以下流程 下面以5.7.23版本为例介绍 第一步:去官网下载5.7.23版本的免安装压缩包形式的mysql文件,贴上 ...

  4. Unbuntu18.04如何备份

    以后可能用的到:https://blog.csdn.net/qq_35523593/article/details/78545530

  5. python3.7 内置函数整理

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 内置函数整理 #abs(x) #返回数字的绝对值. 参数可以是整 ...

  6. IDEA入门学习笔记1:资料收集

    IDEA2018软件下载 :https://mp.weixin.qq.com/s?__biz=MzIwMjE1MjMyMw==&mid=2650200056&idx=1&sn= ...

  7. Python如何查看变量在内存中的地址

    在python中可以用id()函数获取对象的内存地址. 用法: object = 1 + 2 object -- 对象

  8. #pragma与_Pragma(转载)

    C90为预处理指令家族带来一位新成员:#pragma.一般情况下,大家很少见到它.        #pragma的作用是为特定的编译器提供特定的编译指示,这些指示是具体针对某一种(或某一些)编译器的, ...

  9. CodeForce:732B-Cormen — The Best Friend Of a Man

    传送门:http://codeforces.com/problemset/problem/732/B Cormen - The Best Friend Of a Man time limit per ...

  10. debian安装中文字体

    debian刚安装完成之后,因为没有中文字体,会出现方框. 安装中文字体: $ su # apt-get install fonts-arphic-bkai00mp fonts-arphic-bsmi ...