题目描述

我们定义:

$\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. 【HANA系列】SAP HANA计算视图(calculation views)使用RANK报错

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA计算视图(cal ...

  2. 常用js方法封装使用

    // 冒泡排序 export function bubbleSort(arr) { let i = arr.length - 1; while (i > 0) { let maxIndex = ...

  3. GitHub Pages建立第一个静态页面

    1.创建仓库 创建仓库点击右上角的加号,选择newrepository.然后对仓库信息进行设置.注意箭头标识的几个地方.仓库名必须是http://username.github.io的形式.必须勾选p ...

  4. 【洛谷p1970】花匠

    莫得致敬lz谢谢.lz的题解是优秀的题解谢谢! 看算法标签 但是我并不会DP的思路,用一个很神奇的码量超级少的代码(虽然我码了超多),然后其实这个数据可以看做是一个函数嘛对吧:(比如说样例) 那么要注 ...

  5. BZOJ 1100 &&luogu 3454(计算几何+KMP)

    题面 给定一个多边形,求对称轴数量. 分析 初看这似乎是一道计算几何的题目,但是如果暴力枚举对称轴,再去判断对称轴两边的边和角是否相等,时间复杂度为\(O(n^2)\),显然会TLE 问题转换 顺时针 ...

  6. Appium+Python之测试数据与脚本分离

    如果脚本中有很多的魔法数据,那代码的复用性就不会很高,所以我们需要将测试数据和脚本分离. 思路:将测试数据放在一个json文件中,然后写一个读取json文件的基类,测试用例中通过调基类中方法来获取js ...

  7. MS COCO 数据集学习笔记(Common Objects in COntext)

    一.数据来源 COCO中图片资源均引用自Flickr图片网站 二.数据集创建目的 进行图像识别训练,主要针对以下三个方向: (1)object instances (2)object keypoint ...

  8. javascript实现快速排序算法

    忘记了快速排序的思路是怎样的了,复习一下,写了两个实例,发表博文备忘. 对于快速排序的思想,可以参考白话经典算法系列之六 快速排序 快速搞定,讲得比较通俗 prototype扩展的方式 /** * 对 ...

  9. python学习笔记(6)关键字与循环控制

    一.变量和类型 1.基本变量类型 (1)整数 (2)浮点数 (3)字符串 (4)布尔值 (5)空值 (6)函数 (7)模块 (8)类型 (9)自定义类型 print(type()) print(typ ...

  10. tcp 建立连接三次握手

    众所周知,tcp是安全的,可靠的,但是为什么呢.要理解这一点,首先先了解tcp的建立连接的原理. 三次握手 第一次握手:由客户端向服务器发送请求,SYN 表示请求连接,seq是序列号(随机选取). 第 ...