题目描述

我们定义:

$\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. Flink流式引擎技术分析--大纲

    Flink简介 Flink组件栈 Flink特性 流处理特性 API支持 Libraries支持 整合支持 Flink概念 Stream.Transformation.Operator Paralle ...

  2. LeetCode——160 Intersection of Two Linked Lists

    题目 Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 Output: ...

  3. 剑指offer--day04

    1.1题目:变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 1.2解题思路: 当n=1时,结果为1: 当n=2时,结果为2: ...

  4. 应用安全 - 代码审计 - Python

    flask客户端session导致敏感信息泄露 flask验证码绕过漏洞 CodeIgniter 2.1.4 session伪造及对象注入漏洞 沙箱逃逸

  5. DevOps的前世今生

    From今日头条:https://www.toutiao.com/a6534660729453150723/?tt_from=weixin&utm_campaign=client_share& ...

  6. vue --》watch 深度监听的优化。

    话不多说,直接上代码,注释很清楚 <template> <div> <input type="text" v-model="value&qu ...

  7. python程序daemon化

    1 直接空格加& python flask_server.py & 最简单的方式 这样还不行,不知道为什么flask server会自动退出. $ nohup python flask ...

  8. Git-第二篇廖雪峰Git教程学习笔记(1)基本命令,版本回退

    1.安装Git-2.16.2-64-bit.exe后,设置用户名,用户邮箱 #--global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地 ...

  9. ./configure 配置文件时出错checking for g++... no

    checking for g++... no checking for c++... no checking for gpp... no checking for aCC... no 缺少C++编译器 ...

  10. HTMLTestRunner_PY3脚本代码

    HTMLTestRunner_PY3.py文件代码如下: # -*- coding: utf-8 -*- """ A TestRunner for use with th ...