荔枝丹(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. 复习C++_基础、函数、数组、字符串

    程序的开发过程 程序 源程序:用源语言写的,有待翻译的程序: 目标程序:源程序通过翻译程序加工以后生成的机器语言程序: 可执行程序:连接目标程序以及库中的某些文件,生成的一个可执行文件,例如Windo ...

  2. js数据结构处理--------树结构数据遍历

    1.深度遍历 深度遍历利用栈来实现 class Stack { constructor () { this.top = 0, // 栈的长度 this.list = [] } push(item) { ...

  3. vue学习之路 - 3.基本操作(中)

    基本操作(中) 本章节主要介绍:vue的条件渲染.列表渲染,计算属性和侦听器 条件渲染和列表渲染 条件渲染主要使用到了 v-if 指令,列表渲染主要使用了 v-for 指令. 下面介绍 v-if .  ...

  4. 2018.11.3 Nescafe18 T2 太鼓达人

    题目 背景 七夕祭上,Vani 牵着 cl 的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员 XLk.Poet_shy 和 ly ...

  5. 52shaidan.net

    52shaidan.net 52gendan.net 朋友的域名

  6. dataTable 自定义排序

    $("#id").DataTable({ aaSorting: [0, 'desc'], // 默认排序 aoColumnDefs: [ {
 "bSortable&qu ...

  7. Android_组件_Activity基础

    一.概述 Activity是应用组件,提供了用户交互的窗口.一个应用由多个彼此联系的Activity组成.它大多数情况是全屏窗口显示,也可以作为悬浮窗口 或者 多窗口模式. 二.生命周期 下图是来自A ...

  8. python简单试题4

    ( ps : 题目中用到的一些random函数在最后末尾处有介绍)  1,在屏幕上显示跑马灯文字 import os # 调用os模块 import time # 调用时间模块 def main(): ...

  9. Python入门基础--变量与基本数据类型

    变量 什么是变量 变量就是变化的量,变就是变化,量用于衡量描述对象的状态 为什么要有变量 程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序 ...

  10. [Hdu3652]B-number(数位DP)

    Description 题目大意:求小于n是13的倍数且含有'13'的数的个数. (1 <= n <= 1000000000) Solution 数位DP,题目需要包含13,且被13整除, ...