题目描述 Description
Chicken在IEC(International Equestrianism Competition(国际马术表演赛))惨跪,没有成功的上到马,他深刻的记得他的选手号是45,现在Chicken又将要⾯临新的⼀场⽐赛,他希望选手号不出现45(连续),同时他又⼗分讨厌2,所以也不希望4出现在准考证号中。现在他想知道在A和B之间有多少合法的选手号,你能否能满足他上马的欲望呢?
输入描述 Input Description

⼀⾏,2个正整数A,B

输出描述 Output Description
⼀⾏,⼀个整数,表⽰符合要求的准考证号的数量
样例输入 Sample Input
25 50
样例输出 Sample Output
18
数据范围及提示 Data Size & Hint
对于50%的数据,A,B<=1000000
对于100%的数据,A,B<=2*10^9

题外话:其实本题题目描述不是这样,但是因为原题目描述太和谐,于是博主就给改成了更和谐的题目描述。

这道题50分很好拿,暴力随便一搞就可以了。然后100分的话,没有什么思路的话可以打表,f(i)表示0-i之间有多少个合法的就可以,ans就是f(b)-f(a-1)。但是范围为2*10^9,数组开不下,所以我们选择分段打表,每10^6位打一个表,然后对于A,B可以判断出A,B所在块的位置,暴力算一下,中间的就用表预处理一下,一算就好了。下面贴出打表的代码,由于打表部分太长,省略掉表的部分。(int biao[]={此处为表的内容};)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
inline int read()
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}
return x*f;
}
const int maxn=;
bool judge(int now)
{
int tmp=now;bool ok=;
while(tmp)
{
int u=tmp%;
if(u==)return false;
if(u==){ok=;tmp/=;continue;}
if(ok)
{
if(u==)return false;
ok=;
}
tmp/=;
}
return true;
}
int count(int l,int r)
{
int cnt=;
for(int i=l;i<=r;i++)if(judge(i))cnt++;
return cnt;
}
int a,b,pa,pb,ans;
int biao[]=};
int main()
{ a=read();b=read();
pa=a/+;pb=b/;
if(pa-==pb)ans=count(a,b);
else ans=count(a,pa*)+count(pb*+,b)+biao[pb]-biao[pa];
printf("%d\n",ans);
return ;
}

然后想正解,正解是数位DP,dp(i,j)表示一个i位数的第一位为j时候的方案数,这个很好处理,查询时还是类似的思路f(b)-f(A-1),用一个函数处理f(i)的值,此处细节比较多,直接贴代码:

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
#include<string>
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
inline int read()
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}
return x*f;
}
const int maxl=;
int a,b,dp[][],la,lb,A[],B[],t,ans;
void init()
{
for(int i=;i<;i++)if(i!=)dp[][i]=;
for(int i=;i<=;i++)
for(int j=;j<;j++)
{
if(j==)continue;
for(int k=;k<;k++)
{
if(k==)continue;
if(j!= || k!=)dp[i][j]+=dp[i-][k];
}
}
return;
}
int calc_A(int now)
{
int ret=;
if(now<=)return ;
for(int i=;i<A[now];i++)
{
if(i==)continue;
if(i== && A[now+]==)continue;
ret+=dp[now][i];
}
if(now==)if(A[now]!= && (A[now]!= || A[now+]!=))ret++;
if(A[now]!=)ret+=calc_A(now-);
return ret;
}
int calc_B(int now)
{
int ret=;
if(now<=)return ;
for(int i=;i<B[now];i++)
{
if(i==)continue;
if(i== && B[now+]==)continue;
ret+=dp[now][i];
}
if(now==)if(B[now]!= && (B[now]!= || B[now+]!=))ret++;
if(B[now]!=)ret+=calc_B(now-);
return ret;
}
int main()
{
init();
a=read()-;b=read();
t=a;while(t)A[++la]=t%,t/=;
if(a==)A[++la]=;
t=b;while(t)B[++lb]=t%,t/=;
printf("%d\n",calc_B(lb)-calc_A(la));
return ;
}

[KCOJ3393]上马的更多相关文章

  1. 用opencv画矩形打上马赛克Mosaic

    /*----------------------------------------------------------------------------- *   *   版权声明: *   可以 ...

  2. 用Python帮你上马,哪里无码打哪里

    目录 0 引言 1 环境 2 需求分析 3 代码实现 4 代码全景展示 5 后记 0 引言 所谓的像素图,就是对图像做一个颗粒化的效果,使其产生一种妙不可言的朦胧感.费话不多说,先来看一张效果图. ▲ ...

  3. python学习笔记(字符串操作、字典操作、三级菜单实例)

    字符串操作 name = "alex" print(name.capitalize()) #首字母大写 name = "my name is alex" pri ...

  4. [Erlang 0113] Elixir 编译流程梳理

    注意:目前Elixir版本还不稳定,代码调整较大,本文随时失效      之前简单演示过如何从elixir ex代码生成并运行Erlang代码,下面仔细梳理一遍elixir文件的编译过程,书接上文,从 ...

  5. net-force.nl/steganography writeup

    做CTF题好长一段时间了,真的可以学到很多东西.这次,我们开启 net-force.nl 的 Steganography之旅,所谓的隐写术. level 801: Training - Can you ...

  6. 微信小程序之页面路由(九)

    [未经允许,请勿以任何形式转载] 什么是路由? 我们通常理解的路由指分组数据包从源到目的地时,决定端到端路径的网络范围的进程: 借用上面的定义,我们可以理解小程序页面路由,根据路由规则(路径)从一个页 ...

  7. (转)我如何利用前端技术得到 XXOO 网站的 VIP

    网页如图,这里只是说明整个网站的一些技术点,所以不该看的地方我都打上马赛克了,让我们揭开这些网站的整个前端工作原理首先刚进去的时候显示一堆乱七八糟的东西,点进去其中一个页面,下面各种虚假评论,然后每隔 ...

  8. BI软件搞不定业务管理报表的需求

    BI是商业智能的缩写,是可以帮助企业做出明智的业务经营决策的工具,其数据来源于各个业务系统,如ERP.CRM.SCM.进销存.HER.OA等. BI系统不同于传统的管理信息系统,他号称是一个整体应用的 ...

  9. 随机采样方法整理与讲解(MCMC、Gibbs Sampling等)

    本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅.其实参考资料中的资料写的比我好,大家可以看一下!好东西多分享!PRML的第11章也是sampling,有时间后面写到P ...

随机推荐

  1. 【网络知识之六】UDP

    UDP(User Datagram Protocol)用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务. 一.UDP报头UDP报头由4个部分组成,其中两个是可选的(粉红背 ...

  2. 《Linux就该这么学》培训笔记_ch02_一些必须掌握的Linux命令

    本文在原来作者的基础上做一些符合自己的修改.原文参考: <Linux就该这么学>培训笔记_ch02_一些必须掌握的Linux命令.     本章的内容虽然多,基本都是书本原话,但是笔记能精 ...

  3. 《Interest Rate Risk Modeling》阅读笔记——第二章:债券价格、久期与凸性

    目录 第二章:债券价格.久期与凸性 思维导图 瞬时回报率-收益率的例子 第二章:债券价格.久期与凸性 思维导图 瞬时回报率-收益率的例子

  4. 用Java编程能给物联网(IoT)带来什么优势与不同?

    用Java编程能给物联网(IoT)带来什么优势与不同? 这是一个不太容易回答的问题,也是一个适合拿出来与大家讨论的一个话题~首先需要聊聊物联网硬件与嵌入式设备有什么不同.嵌入式设备通常是一个软件一体的 ...

  5. laravel框架模型model的创建与使用方法

    这篇文章给大家介绍的内容是关于laravel框架模型model的创建与使用方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.创建model 2. 1 2 3 4 5 6 7 8 ...

  6. SpringCloud入门概述

    SpringCloud入门概述 Spring的三大模块:SpringBoot(构建),Spring Cloud(协调),Spring Cloud Data Flow(连接)注意:Spring Boot ...

  7. MarkDown的一些基本语法

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. Markdown的语法简洁明了.学习容易,而且功能比纯文本更强,因此有很多人用它写 ...

  8. JavaIO学习:字节流

    JavaIO流之字节流 字节流 抽象基类:InputStream,OutputStream. 字节流可以操作任何数据. 注意: 字符流使用的数组是字符数组,char[] chs : 字节流使用的数组是 ...

  9. 蒙特卡罗方法、蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS)初探

    1. 蒙特卡罗方法(Monte Carlo method) 0x1:从布丰投针实验说起 - 只要实验次数够多,我就能直到上帝的意图 18世纪,布丰提出以下问题:设我们有一个以平行且等距木纹铺成的地板( ...

  10. notepad++格式化代码,自动对齐

    Notepad++本身没有快捷命令格式化JavaScript代码,需要通过安装扩展插件来实现快捷格式化JS代码的功能.本文主要介绍如何通过安装JStool插件来实现格式化JS代码的功能. 在插件列表中 ...