[KCOJ3393]上马
|
题目描述 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]上马的更多相关文章
- 用opencv画矩形打上马赛克Mosaic
/*----------------------------------------------------------------------------- * * 版权声明: * 可以 ...
- 用Python帮你上马,哪里无码打哪里
目录 0 引言 1 环境 2 需求分析 3 代码实现 4 代码全景展示 5 后记 0 引言 所谓的像素图,就是对图像做一个颗粒化的效果,使其产生一种妙不可言的朦胧感.费话不多说,先来看一张效果图. ▲ ...
- python学习笔记(字符串操作、字典操作、三级菜单实例)
字符串操作 name = "alex" print(name.capitalize()) #首字母大写 name = "my name is alex" pri ...
- [Erlang 0113] Elixir 编译流程梳理
注意:目前Elixir版本还不稳定,代码调整较大,本文随时失效 之前简单演示过如何从elixir ex代码生成并运行Erlang代码,下面仔细梳理一遍elixir文件的编译过程,书接上文,从 ...
- net-force.nl/steganography writeup
做CTF题好长一段时间了,真的可以学到很多东西.这次,我们开启 net-force.nl 的 Steganography之旅,所谓的隐写术. level 801: Training - Can you ...
- 微信小程序之页面路由(九)
[未经允许,请勿以任何形式转载] 什么是路由? 我们通常理解的路由指分组数据包从源到目的地时,决定端到端路径的网络范围的进程: 借用上面的定义,我们可以理解小程序页面路由,根据路由规则(路径)从一个页 ...
- (转)我如何利用前端技术得到 XXOO 网站的 VIP
网页如图,这里只是说明整个网站的一些技术点,所以不该看的地方我都打上马赛克了,让我们揭开这些网站的整个前端工作原理首先刚进去的时候显示一堆乱七八糟的东西,点进去其中一个页面,下面各种虚假评论,然后每隔 ...
- BI软件搞不定业务管理报表的需求
BI是商业智能的缩写,是可以帮助企业做出明智的业务经营决策的工具,其数据来源于各个业务系统,如ERP.CRM.SCM.进销存.HER.OA等. BI系统不同于传统的管理信息系统,他号称是一个整体应用的 ...
- 随机采样方法整理与讲解(MCMC、Gibbs Sampling等)
本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅.其实参考资料中的资料写的比我好,大家可以看一下!好东西多分享!PRML的第11章也是sampling,有时间后面写到P ...
随机推荐
- centos7上配置mysql8的双主互写
注意:1.主库1:10.1.131.75,主库2:10.1.131.762.server-id必须是纯数字,并且主从两个server-id在局域网内要唯一. [主节点1]vi /etc/my.cnf[ ...
- SQL Server 2014:为什么会提示“用户登录失败”?
SQL Server有两种登录方式,Windows身份验证和sql server身份验证,其对应的数据库连接字符串如下: Windows身份验证 ----- @"Data Source=DE ...
- linux搜索log文件的内容
日志一般是记载每天所做的工作.在计算机科学中,日志是指服务器等电脑设备或软件的运作记录(Server log).在电脑设备和软件出现问题时,日志是我们在排查问题的一个重要依据.查询日志是用户记录从客户 ...
- 解决Docker服务无法正常启动
重新docker服务报错如下: systemctl restart docker.service Cannot connect to the Docker datemon at tcp://0.0.0 ...
- JavaScriptCore在浏览器引擎中的位置
因为随着JS这门语言的发展,JS的宿主越来越多,有各种各样的浏览器,甚至是常见于服务端的Node.js(基于V8运行). 2. Webkit 源代码由三大模块组成: 1). WebCore ...
- Centos7/Ubuntu 初始化硬盘分区、挂载
刚刚在腾讯云买了一台服务器,刚买的服务器的数据盘都是需要自己来分区的,下面就记录一下操作. 通过命令fdisk-l查看硬盘信息 可以看到有两块硬盘/dev/vda和/dev/vdb,启动vda是系统盘 ...
- 【HTML】处理<br>换行符追加到前端换行无效的问题 --- html中渲染的字符串中包含HTML标签无效的处理方法,字符串中包含HTML标签被转义的问题 解决
需求如下图: 追加给前台后,效果如下: 可以在源码看到: 是将后台给出来的数据,直接当作字符串给填充在了前台HTML中. 而查看浏览器编译后的HTML源码可以发现: 原来字符串中的<br> ...
- 【linux】CentOS 查看系统时间,修改时区
===============CentOS 7.6================ 1.查看系统时间 date 查看当前系统时间以及时区结果是: Mon Jul 8 09:23:31 UTC 2019 ...
- Prometheus监控学习笔记之Prometheus 2.x版本的常用变化
最近用了prometheus 2.0 版本,感觉改变还是有点大,现将改变相关记录如下: 1.prometheus.yml文件配置修改后,要想重新加载,必须在启动的时候添加参数: --web.enabl ...
- c# 项目nuget不自动安装dll
问题 创建的项目提交到服务器上,其他人下载项目后无法生成解决方案成功,无法自动生成dll,无法自动下载安装相应的插件 解决方案 删除packages文件夹即可,nuget就可以自动安装相关的dll了