题目描述

我们定义:

$\overline{d_k...d_2d_1}=\sum \limits_{i=1}^kd_i\times {10}^{i-1}=n(d_i\in [0,9]\ and\ d_i\in Z)$

我们对于任何正整数,定义一个函数:

$reverse(\overline{d_1d_2...d_k})=\overline{d_k...d_2d_1})$

比如:$reverse(123)=321,reverse(1000)=1,reverse(520)=25$。

现在,给出两个正整数$L,R$,请求出下面这个集合的大小:

$\{ n\in Z |L\leqslant n\leqslant R\ and\ L\leqslant reverse(n)\leqslant R\}$


输入格式

第一行包含三个整数$T,a,b$分别表示测试数据组数,特殊性质$1$,特殊性质$2$(如果该组数据包含特殊性质$1$,则$a=1$,否则$a=0$;如果该组数据包含特殊性质$2$,则$b=1$,否则$b=0$)。
接下来$T$行每行包含两个整数$L,R$。


输出格式

对于每组数据,输出一行,包含一个整数表示答案。


样例

样例输入:

3 0 0
1 10
10 20
123 12345

样例输出:

10
1
9952


数据范围与提示

对于所有数据,$T=50$。
特殊性质$1$:$L=1$。
特殊性质$2$:$R={10}^k$(即所有$R$都是$10$的整数次幂)
令$1\leqslant L\leqslant R\leqslant N$。


题解

$20\%$算法:

暴力枚举就好啦,不做过多解释。

时间复杂度:$\Theta(T\times(R-L))$。

期望得分:$20$分。

实际得分:$20$分。

另外$20\%$算法:

满足两个特殊性质,考虑从这里入手,$L=1$就说明所有的数都可以,$R={10}^k$说明所有小于等于它的书也都可以,那么第$3,4$个测试点的答案就是$R$。

时间复杂度:$\Theta(T)$。

期望得分:$20$分。

实际得分:$20$分。

$100\%$算法:

发现我们可以计算出$[1,L-1]$中和$[1,R]$中符合条件的数的个数。

那么考虑数位$DP$,定义$dp[i][j]s_1][s_2]$表示 计算了$i$位,当前的前缀长度都是$j$,并且将前缀$reverse$后与$L$和$R$的后$j$位比较结果为$s_1,s_2$,后面的选择有多少种($s_1,s_2$表示大于,等于,小于)。

最后注意,数据范围是$2^{64}-1$,所以我们需要用到一个东西叫做$unsigned\ long\ long$。

时间复杂度:$\Theta(T\times$状态数$\times 10)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
unsigned long long L,R;
unsigned long long dp[22][22][3][3];
int pre_num1[22],pre_num2[22],pro_num[22];
unsigned long long dfs(int pos,int revp,int cmpl,int cmpr,bool lim)
{
if(!pos)
{
if(revp<pre_num1[0]+1)cmpl=0;
if(revp<pre_num2[0]+1)cmpr=0;
return cmpl&&cmpr!=2;
}
if(dp[pos][revp][cmpl][cmpr]!=-1&&!lim)return dp[pos][revp][cmpl][cmpr];
int flag=lim?pro_num[pos]:9;
unsigned long long res=0;
for(int i=0;i<=flag;i++)
{
int ncl,ncr;
if(i==pre_num1[revp])ncl=cmpl;
else ncl=i>pre_num1[revp]?2:0;
if(i==pre_num2[revp])ncr=cmpr;
else ncr=i>pre_num2[revp]?2:0;
res+=dfs(pos-1,revp+1,ncl,ncr,lim&&i==flag);
}
if(!lim)dp[pos][revp][cmpl][cmpr]=res;
return res;
}
unsigned long long calc(unsigned long long x)
{
if(!x)return 0;
memset(dp,-1,sizeof(dp));
memset(pro_num,0,sizeof(pro_num));
while(x)
{
pro_num[++pro_num[0]]=x%10;
x/=10;
}
unsigned long long res=0;
for(int i=pre_num1[0];i<=pro_num[0];i++)
{
int flag=i==pro_num[0]?pro_num[i]:9;
for(int j=1;j<=flag;j++)
{
int ncl,ncr;
if(j==pre_num1[1])ncl=1;
else ncl=j>pre_num1[1]?2:0;
if(j==pre_num2[1])ncr=1;
else ncr=j>pre_num2[1]?2:0;
res+=dfs(i-1,2,ncl,ncr,i==pro_num[0]&&j==flag);
}
}
return res;
}
int main()
{
int T,a,b;
scanf("%d%d%d",&T,&a,&b);
while(T--)
{
scanf("%llu%llu",&L,&R);
unsigned long long l=L,r=R;
memset(pre_num1,0,sizeof(pre_num1));
memset(pre_num2,0,sizeof(pre_num2));
while(l){pre_num1[++pre_num1[0]]=l%10;l/=10;}
while(r){pre_num2[++pre_num2[0]]=r%10;r/=10;}
printf("%llu\n",calc(R)-calc(L-1));
}
return 0;
}

rp++

[CSP-S模拟测试]:reverse(数位DP)的更多相关文章

  1. 2018.08.18 NOIP模拟 game(数位dp)

    Game 题目背景 SOURCE:NOIP2015-SHY4 题目描述 Alice 和 Bob 正在玩一个游戏,两个人从 1 轮流开始报数,如果遇到 7 的倍数或者遇到的这个数的十进制表示中含 7 , ...

  2. 2018.06.26 NOIP模拟 号码(数位dp)

    题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的 ...

  3. [CSP-S模拟测试]:蛇(DP+构造+哈希)

    题目传送门(内部题140) 输入格式 前两行有两个长度相同的字符串,描述林先森花园上的字母. 第三行一个字符串$S$. 输出格式 输出一行一个整数,表示有多少种可能的蛇,对$10^9+7$取模. 样例 ...

  4. [CSP-S模拟测试]:Reverse(模拟+暴力+剪枝)

    题目描述 小$G$有一个长度为$n$的$01$串$T$,其中只有$T_S=1$,其余位置都是$0$.现在小$G$可以进行若干次以下操作: $\bullet$选择一个长度为K的连续子串($K$是给定的常 ...

  5. [CSP-S模拟测试]:reverse(模拟)

    题目传送门(内部题56) 输入格式 第一行包含一个整数:$T$,表示数据组数.接下来$T$行,每行包含两个字符串:$a\ b$. 输出格式 对于每组数据,如果存在$c$,输出最长的情况下字典序最大的$ ...

  6. [CSP-S模拟测试]:B(DP+数学)

    题目传送门(内部题45) 输入格式 第一行$3$个整数$n,m,P$.第二行$m$个整数,表示$m$次询问. 输出格式 一行$m$个整数表示答案. 样例 样例输入1: 2 4 40 1 2 3 样例输 ...

  7. [CSP-S模拟测试]:最小值(DP+乱搞)

    题目背景 $Maxtir$更喜欢序列的最小值. 题目传送门(内部题128) 输入格式 第一行输入一个正整数$n$和四个整数$A,B,C,D$. 第二行输入$n$个整数,第$i$个数表示$a_i$. 输 ...

  8. [CSP-S模拟测试]:花(DP)

    题目传送门(内部题111) 输入格式 一个整数$T$,表示测试数据组数. 每组测试数据占一行,两个整数,分别表示$L$和$S$. 输出格式 对每组数据,输出一个整数表示答案. 样例 样例输入1: 13 ...

  9. [CSP-S模拟测试]:计数(DP+记忆化搜索)

    题目描述 既然是萌萌哒$visit\text{_}world$的比赛,那必然会有一道计数题啦!考虑一个$N$个节点的二叉树,它的节点被标上了$1\sim N$的编号.并且,编号为$i$的节点在二叉树的 ...

随机推荐

  1. chapter2

    Chapter2 Tip1 静态工厂方法代替构造器 公有的静态方法,只是一个返回类实例的静态方法. 静态工厂方法的优势: 优势一: 有名称,如果构造器本身没有正确的描述被返回的对象,具有适当名称的静态 ...

  2. Creat-React-Native-App 之StackNavigator之踩坑记录

    Creat-React-Native-App简称CRNA. 在我开始入门RN时fb已经推出和Expo联合开发用于快速创建React Native应用的工具: Create-React-Native-A ...

  3. SpringBoot官方文档学习(二)使用Spring Boot构建系统

    强烈建议您选择一个支持依赖关系管理并且可以使用发布到“ Maven Central”仓库的构建系统.我们建议您选择Maven或Gradle.其他构建系统(例如,Ant)也可以和Spring Boot一 ...

  4. HDU-1181 变形课(多种方式,好题)

      首先想到的是并查集,然后WA...原因在这,我第一次敲的是Find(1) == Find(12)来作为可以成功的条件,实际上这样是不行的,比方说 bell 和 mail实际上是不满足条件的,可以理 ...

  5. linux下docker启动nginx无法访问80端口

    问题: Linux安装了docker,docker启动了一个nginx容器,通过 80 端口无法正常访问 故障排查: 1.检查 nginx 容器启动的命令或者yaml文件,查看是否有跟本机端口进行绑定 ...

  6. 26、前端知识点--利用webpack搭建脚手架一套完整流程

    前言 我们的目标是利用webpack搭建一个基于react + react-router +dva + es6 + less + antd用于中后台开发的脚手架,同学们可能会说社区里那么多优秀的脚手架 ...

  7. TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议

    把这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数 ...

  8. Webpack Loader种类以及执行顺序

    我们在用webpack构建项目的时候,有两种配置打包文件的方式: import或者require :a-loader!b-loader!.././static/dog.png(打包某一个文件) 配置w ...

  9. STM32之红外遥控信号自学习实现

    一.序言 很早前就想实现这个红外遥控自学习的这个实验,用于来自己控制房子里如空调等红外遥控设备的自动化,NEC的标准到具体的产品上可能就被厂家定义为不一样了,所以自学习就应该是接收到什么就发送什么,不 ...

  10. linux测试 Sersync 是否正常

    [root@SERSYNC web]# for i in {1..10000};do echo 123456 > /data/web/$i &>/dev/null;do ne [r ...