荔枝丹(litchi)

题目描述

绛雪艳浮红锦烂,玉壶光莹水晶寒。

高名已许传新曲,芳味曾经荐大官。

乌府日长霜署静,几株斜覆石栏杆。

——明·陈辉《荔枝》

荔枝(丹),拼音为lizhidan,一种好吃的水果,深得悦色老师的喜爱。

祝阿姨得到了许多许多的荔枝丹,每个荔枝丹上都有一个00到99之间的数字。祝阿姨把它们分成许多组,每组表示一个数,且所有组表示的数字合起来恰好是[L,R][L,R]内的所有数。

祝阿姨知道悦色老师特别喜欢吃荔枝丹,于是邀请了悦色老师来吃荔枝丹。悦色老师最喜欢吃有数字00的荔枝丹了,她吃掉了所有数字为00的荔枝丹。

祝阿姨想知道还剩下多少不同的组。注意悦色老师吃完后,荔枝丹就无序了,也就是说123123和321321是同样的组。

输入

一行两个正整数L,RL,R。

输出

一行一个整数,表示还剩下多少不同的组。

样例输入

<span style="color:#333333"><span style="color:#333333">【样例1输入】
1 10 【样例2输入】
40 57 【样例3输入】
157 165 </span></span>

样例输出

<span style="color:#333333"><span style="color:#333333">【样例1输出】
9
【样例2输出】
17
【样例3输出】
9</span></span>

提示

【子任务】

测试点

R

R-L

1~2

≤106

≥0

3~4

≤1018

0≤R-L≤1000000

5~20

≥0

来源

noip2017模拟-wmd


solution

首先由18位的不同数码(无序)的数量为

C(27,9)约=4e6

所以我们可以枚举所有可能的数码,然后判断这个数码能否在[l,r]中出现

用go(pos,l_flag,r_flag),表示到了第pos位,当前获得的数字是否等于相应的L/R的前缀,返回当前枚举的字符串能否构造出来。

分类讨论:

如果pos == n,则返回true。

如果l_flag == 1 && r_flag == 1,进一步讨论:

如果L[pos] == R[pos],则在第pos位只能是L[pos],然后进行go(pos+1, 1, 1);

如果L[pos]<R[pos],那么如果可以放[L[pos]+1,R[pos]-1]中的数字,那么一定可行;如果不可以,则尝试放L[pos]并继续go(pos+1,1,0)或放R[pos]并继续go(pos+1,0,1)。

如果l_flag和r_flag有且仅有一个为真,则与上面的讨论类似,先考虑把那个卡边界的弄成不卡的,如果可行直接返回真,不可行就继续卡边界继续枚举。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
ll l,r,L[20],R[20],ans,num[20],f[10];
bool pd(int k,int fl,int fr){
//cout<<k<<' '<<fl<<' '<<fr<<endl;
if(k==19)return 1;
if(fl==0&&fr==0)return 1;
if(fl==1&&fr==1){
if(L[k]==R[k]){
if(f[L[k]]){
f[L[k]]--;int t=pd(k+1,1,1);f[L[k]]++;
return t;
}
else return 0;
}
if(L[k]<R[k]){
for(int i=L[k]+1;i<R[k];i++)if(f[i])return 1;
bool can=0;
if(f[L[k]]){
f[L[k]]--;can|=pd(k+1,1,0);f[L[k]]++;
}
if(can)return 1;
if(f[R[k]]){
f[R[k]]--;can|=pd(k+1,0,1);f[R[k]]++;
}
return can;
}
if(L[k]>R[k])return 0;
}
if(fl==1){
for(int i=L[k]+1;i<=9;i++)if(f[i])return 1;
if(f[L[k]]){
f[L[k]]--;int t=pd(k+1,1,0);f[L[k]]++;
return t;
}
return 0;
}
if(fr==1){
for(int i=R[k]-1;i>=0;i--)if(f[i])return 1;
if(f[R[k]]){
f[R[k]]--;int t=pd(k+1,0,1);f[R[k]]++;
return t;
}
return 0;
}
}
void dfs(int k){
//cout<<k<<endl;
if(k==19){
for(int i=0;i<=10;i++)f[i]=0;
for(int i=1;i<=18;i++)f[num[i]]++;
//for(int i=0;i<=9;i++)cout<<f[i]<<' ';cout<<endl;
//for(int i=1;i<=18;i++)cout<<num[i];cout<<endl;
if(pd(1,1,1))ans++;
return;
}
for(int i=num[k-1];i<=9;i++){
num[k]=i,dfs(k+1);
}
}
int main(){
cin>>l>>r;
if(r==(ll)1e18){
if(l<=(ll)1e17)r--;
else r--,ans++;
}
int top=18;
for(top=18;top>0;top--)L[top]=l%10,l/=10;
for(top=18;top>0;top--)R[top]=r%10,r/=10;
//for(int i=1;i<=18;i++)cout<<L[i];cout<<endl;
//for(int i=1;i<=18;i++)cout<<R[i];cout<<endl;
dfs(1);
cout<<ans<<endl;
return 0;
}

荔枝丹(litchi)的更多相关文章

  1. 真正的RISC-V开发板——VEGA织女星开发板开箱评测

    前言 由于最近ARM公司要求员工"停止所有与华为及其子公司正在生效的合约.支持及未决约定",即暂停与华为的相关合作,大家纷纷把注意力投向了另一个的处理器架构RISC-V,它是基于精 ...

  2. 【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境

    喜欢今日头条,偶然看到广告,半个多月前交了8.9元,报名参加了头条上Python的四天培训课,呵呵,总算是有了零的开始(还是有点收获的,见https://www.sohu.com/a/38112874 ...

  3. 北工大耿丹学院16级计科院3班C语言课程助教学期总结

    很荣幸得到邹老师,周老师,以及北工大耿丹学院各位老师的认可,担任计科院3班C语言课程助教,班主任为李光杰老师,很感谢李老师一学期的帮助,使得我更好的担任助教一职.我班学生31名,很愉快的与同学们度过一 ...

  4. 荔枝FM架构师刘耀华:异地多活IDC机房架构 - 极客头条 - CSDN.NET

    荔枝FM架构师刘耀华:异地多活IDC机房架构 - 极客头条 - CSDN.NET 荔枝FM架构师刘耀华:异地多活IDC机房架构 - 极客头条 - CSDN.NET 途牛谭俊青:多数据中心状态同步&am ...

  5. [转]分布式消息中间件 MetaQ 作者庄晓丹专访

    MetaQ(全称Metamorphosis)是一个高性能.高可用.可扩展的分布式消息中间件,思路起源于LinkedIn的Kafka,但并不是Kafka的一个Copy.MetaQ具有消息存储顺序写.吞吐 ...

  6. 北京工业大学耿丹学院2016下C作业学习总结

    北京工业大学耿丹学院2016下C的班级地址在https://edu.cnblogs.com/campus/bjgygd/Sixteen-One . 第一次作业:两部分 第一部分:新建博客,书写第一篇随 ...

  7. 为嵌入式全志V3s荔枝派板卡添加USB MT7601U(小米随身WIFI)驱动

    折腾了了一天终于scan出环境热点了,感觉本来挺简单的事情,网上教程一大把还费了一天的劲,很丧.不过网上教程虽多,但是还还是有些不同之处的,现在特意总结一下 全志V3s荔枝派板卡 添加该驱动的过程. ...

  8. [No0000F1]js获取喜马拉雅和荔枝FM电台专辑音频

    荔枝FM小书签.txt javascript: (function() { if ($('#down_url')) { $('#down_url').remove(); }; $(document.b ...

  9. 20155331 丹增旦达 网络攻防 Exp2后门原理与实践

    20155331 丹增旦达<网络攻防>Exp2后门原理与实践 实验内容 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启 ...

随机推荐

  1. yield 生成器的运行机制

    yield 生成器的运行机制 当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把 yield 的参数给你,之后生成器就不会往下继续运行. 当你问他要下一个数时,他会从上次的状态 ...

  2. 网络编程——网络模型和InetAddress类

    第1章 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和 ...

  3. iOS 反射函数: performSelector, NSInvocation, objc_msgSend

    当我们有方法名和参数列表,想要动态地给对象发送消息,可用通过反射函数机制来实现,有两种常用的做法: 一.performSelector - (id)performSelector:(SEL)aSele ...

  4. cocoapods 类库管理利器

    作为iOS开发者,第三方类库的使用是最经常的,但鉴于第三方类库的不断更新以及其可能需要依存其他类,如果要使用最新版那么我们需要重新下载再添加到项目中,无疑带来一些繁琐的麻烦,那么现在这里就有一款能解决 ...

  5. oracle数据库删除表时遇见需要解锁问题

    今天在进行数据清空时,不注意把表锁住了,记录一下解锁过程. 第一步执行 select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked ...

  6. SVG path

    在网页上画一图形,比如星星或波浪线,开始是想着图形软件画一个的,后来发现SVG这绘图程序的语言,感觉甚是可以,就发了些时间学了一下,在此做一简单分享和记录. 菜鸟上是这么介绍的(SVG 是使用 XML ...

  7. 文档处理jQuery,实现添加删除复制

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. spring boot 集成swagger2

    1  在pom.xml中加入Swagger2的依赖 <dependency> <groupId>io.springfox</groupId> <artifac ...

  9. nginx反向代理后端web服务器记录客户端ip地址

    nginx在做反向代理的时候,后端的nginx web服务器log中记录的地址都是反向代理服务器的地址,无法查看客户端访问的真实ip. 在反向代理服务器的nginx.conf配置文件中进行配置. lo ...

  10. POJ 3414 BFS 输出过程

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17456   Accepted: 7407   Special J ...