[CSP-S模拟测试]:reverse(数位DP)
题目描述
我们定义:
$\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)的更多相关文章
- 2018.08.18 NOIP模拟 game(数位dp)
Game 题目背景 SOURCE:NOIP2015-SHY4 题目描述 Alice 和 Bob 正在玩一个游戏,两个人从 1 轮流开始报数,如果遇到 7 的倍数或者遇到的这个数的十进制表示中含 7 , ...
- 2018.06.26 NOIP模拟 号码(数位dp)
题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的 ...
- [CSP-S模拟测试]:蛇(DP+构造+哈希)
题目传送门(内部题140) 输入格式 前两行有两个长度相同的字符串,描述林先森花园上的字母. 第三行一个字符串$S$. 输出格式 输出一行一个整数,表示有多少种可能的蛇,对$10^9+7$取模. 样例 ...
- [CSP-S模拟测试]:Reverse(模拟+暴力+剪枝)
题目描述 小$G$有一个长度为$n$的$01$串$T$,其中只有$T_S=1$,其余位置都是$0$.现在小$G$可以进行若干次以下操作: $\bullet$选择一个长度为K的连续子串($K$是给定的常 ...
- [CSP-S模拟测试]:reverse(模拟)
题目传送门(内部题56) 输入格式 第一行包含一个整数:$T$,表示数据组数.接下来$T$行,每行包含两个字符串:$a\ b$. 输出格式 对于每组数据,如果存在$c$,输出最长的情况下字典序最大的$ ...
- [CSP-S模拟测试]:B(DP+数学)
题目传送门(内部题45) 输入格式 第一行$3$个整数$n,m,P$.第二行$m$个整数,表示$m$次询问. 输出格式 一行$m$个整数表示答案. 样例 样例输入1: 2 4 40 1 2 3 样例输 ...
- [CSP-S模拟测试]:最小值(DP+乱搞)
题目背景 $Maxtir$更喜欢序列的最小值. 题目传送门(内部题128) 输入格式 第一行输入一个正整数$n$和四个整数$A,B,C,D$. 第二行输入$n$个整数,第$i$个数表示$a_i$. 输 ...
- [CSP-S模拟测试]:花(DP)
题目传送门(内部题111) 输入格式 一个整数$T$,表示测试数据组数. 每组测试数据占一行,两个整数,分别表示$L$和$S$. 输出格式 对每组数据,输出一个整数表示答案. 样例 样例输入1: 13 ...
- [CSP-S模拟测试]:计数(DP+记忆化搜索)
题目描述 既然是萌萌哒$visit\text{_}world$的比赛,那必然会有一道计数题啦!考虑一个$N$个节点的二叉树,它的节点被标上了$1\sim N$的编号.并且,编号为$i$的节点在二叉树的 ...
随机推荐
- Python工具库(感谢backlion整理)
漏洞及渗透练习平台: WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.co ...
- 《剑指offer》面试题20 顺时针打印矩阵 Java版
我的方法:遇到这种题最好在纸上画一画打印路线.我利用了4个标志left.top.right.bottom,表示当前需要打印的左界.上届.右界和下界,换句话说这些界线之外的已经打印了,如此一来判断结束的 ...
- make: *** 没有指明目标并且找不到 makefile
make: *** 没有指明目标并且找不到 makefile. 停止. make: *** 没有规则可以创建目标“install”. 停止. 不是没有makefile文件,而是你没有安装gcc编译 ...
- 29、前端知识点--session\cookie\token
Java Token的原理和生成使用机制 https://yq.aliyun.com/articles/594217 Cookies Session Token 三者区别及应用场景 https://w ...
- 前端开发HTML&css入门——CSS的文本格式化
长度单位 像素 px 百分比 % em - 像素是我们在网页中使用的最多的一个单位, * 一个像素就相当于我们屏幕中的一个小点, * 我们的屏幕实际上就是由这些像素点构成的 * 但是这些像素点,是不能 ...
- 浅析API和SDK
前言 最近有小伙伴咨询胡哥关于API和SDK的概念以及区别,今天给大家来阐述下我的理解,手动微笑.gif. API 1. 定义 API(Application Programming Interfac ...
- Jsp 自定义tag标签
1转自:https://blog.csdn.net/yusimiao/article/details/46835617 Jsp自定义tag标签 自定义tag标签的好处 程序员可以自定一些特定功能的标记 ...
- 机器学习-K-means聚类及算法实现(基于R语言)
K-means聚类 将n个观测点,按一定标准(数据点的相似度),划归到k个聚类(用户划分.产品类别划分等)中. 重要概念:质心 K-means聚类要求的变量是数值变量,方便计算距离. 算法实现 R语言 ...
- linux里面以指定用户运行命令
一.chroot方式 [root@localhost ~]# chroot --userspec "nginx:nginx" "/" sh -c "w ...
- python面向对象--item方法
class Foo: def __getitem__(self, item): print("getitem") return self.__dict__[item] def __ ...