荔枝丹(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. Wordpress菜单函数wp_nav_menu各参数详解及示例

    Wordpress菜单函数wp_nav_menu各参数详解及示例   注册菜单 首先要注册菜单,将以下函数添加至function.php函数里   register_nav_menus(array( ...

  2. Nodejs:Node.js模块机制小结

    今天读了<深入浅出Nodejs>的第二章:模块机制.现在做一个简单的小结. 序:模块机制大致从这几个部分来讲:JS模块机制的由来.CommonJS AMD CMD.Node模块机制和包和n ...

  3. Springboot端口设置

    application.properties 加入 server.port=80

  4. java算法面试题:排序都有哪几种方法?请列举。用JAVA实现一个快速排序。选择冒泡快速集合至少4种方法排序

    package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.Compar ...

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

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

  6. pytthon + Selenium+chrome linux 部署

    1,centos7 安装 google-chrome (1) 添加chrome的repo源 vi /etc/yum.repos.d/google.repo [google] name=Google-x ...

  7. Docker容器学习--1

    Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker是通过内核虚拟化技 ...

  8. (转)规划从 OpenGL ES 2.0 到 Direct3D 的移植

    如果你移植 iOS 或 Android 平台中的游戏,那么你可能需要在 OpenGL ES 2.0 方面进行大量投资.如果你准备将你的图形管道代码库移动到 Direct3D 11 和 Windows ...

  9. ZendFramework-2.4 源代码 - 关于配置

    $applicationConfig = $serviceManager->setService('ApplicationConfig'); // 获取配置 /data/www/www.doma ...

  10. Django2.1中的分页功能详解

    django的分页功能类将我们常用的多种方法均封装在Paginator类,根据这些方法我们均可深度定制我们的分页功能. 首先来看看[Paginator] 类的构造方法: class Paginator ...