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. uva10129 PlayOnWords(并查集,欧拉回路)

    判断无向图是否存在欧拉回路,就是看度数为奇数的点有多少个,如果有两个,那么以那分别两个点为起点和终点,可以构造出一条欧拉回路,如果没有,就任意来,否则,欧拉回路不存在. 首先用并查集判断连通,然后统计 ...

  2. C++ Stack 与String

    // ConsoleApplication1.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include "pch.h" ...

  3. ovs的学习

    本来编辑好了的, 结果忘了保存, 坑爹,直接把人家的网址贴上来吧 http://blog.chinaunix.net/uid-20737871-id-4333314.html 昨天遇到一个问题(虚拟机 ...

  4. 类库日期和jsp导包

    一.日期类库 1.1. Date Date类创建一个时间,或者是创建一个与你计算机当前的时间:精确到毫秒. //实例化时间类 Date date = new Date(); 1.2.格式转换类 1.2 ...

  5. oracle中的树状查询

    oracle中的树状查询 工作中经常会遇到将数据库中的数据以树的形式展现的需求.以下我们来看一下该需求在Oracle中如何实现. 首先我们需要有一个树形的表结构(当然有时候会出现表结构不是典型的树形结 ...

  6. VMWare安装苹果Mac OS X

    随着iPhone.iPad.Mac等苹果产品越来越火爆,越来越多的初学者想要了解和尝试苹果平台,包括苹果操作系统Mac OS X.苹果演示软件Keynote.苹果开发工具Xcode等.然而,苹果电脑价 ...

  7. pandas学习series和dataframe基础

    PANDAS 的使用 一.什么是pandas? 1.python Data Analysis Library 或pandas 是基于numpy的一种工具,该工具是为了解决数据分析人物而创建的. 2.p ...

  8. Java-JFrame开发汇总整理

    Java-JFrame开发汇总整理 在CS框架下,可以通过java代码开发JFrame弹窗体的功能,即类似于QQ登录等安装在计算机中的程序,通过java开发CS中C即客户端的一般用到的知识点如下: 一 ...

  9. vue-highlightjs的使用小结

    万能的github真主,让我们强大!在vue的项目中想使用highlight.js这样的代码高亮?有人帮助我们实现了vue-highlightjs 安装 yarn add highlight.js - ...

  10. 记一次低级错误导致的mysql(111)

    今天下午配好的双主多从服务器,两台主机+主机内安装好的6台虚拟机,两台Mysql master各授权好其slave的远程登录,原本好端端的能远程登录,晚上回来时候就发现其中一台master登录不上其s ...