题目描述

小N对于数字的大小一直都有两种看法。第一种看法是,使用字典序的大小(也就是我们常用的判断数字大小的方法,假如比较的数字长度不同,则在较短一个前面补齐前导0,再比较字典序),比如43<355,10<11。第二种看法是,对于一个数字,定义他的权值为,也就是各个数位的乘积。
现在给定两个区间,[L,R]与[L1,R1]。小N现在想知道,有多少使用字典序判大小法在[L,R]之间的数字,满足其第二种定义的权值也在[L1,R1]之间。
换句话说,对于一个数x,定义f(x)为x的各个数位的乘积。对于L<=x<=R,问有多少x满足,L1<=f(x)<=R1。

输入描述:

第一行四个整数L,R,L1,R1。

输出描述:

一行一个整数,代表小N想知道的数的数量。
示例1

输入

复制

34 10000 24 57

输出

复制

777

备注:

20%: L,R <= 10000000
40%: L,R <= 3*10^7
60%: L,R,L1,R1 <= 10^9
另外有20%:L1,R1<=1000
100%: 0<=L,R,L1,R1 <= 10^18, L <= R, L1 <= R1

Solution:

  本题出题人神犇WWT说是经典的数位dp,,,考试时谁都知道是数位dp吖,当时脑抽感觉乘积的情况太多,定义状态怕炸空间,然后就GG了。

  因为数最多有18位,每位除0外有9种填数情况,开始认为状态最多$18*9^{18}$,即使有重复的乘积我也觉得空间开不下,所以弃疗直接裸暴力。然而结果就是状态数其实不大,重复的状态很多很多,完全可以开个map来定义状态,这里我想吐槽了!

  于是定义状态$f[i][j]$表示到了第$i$位乘积为$j$的不受限制的合法个数(用map存),然后就是经典的数位记忆化搜索了,注意限制条件决定了从高位向低位搜索,另一个小细节就是有可能合法个数为0,而状态的初值也为0,这样就不方便判断当前状态是否已经搜索过了,简单的解决办法是记录状态的合法个数时+1,取出状态时-1就好了。

  最后简单讲下神犇WWT的绝妙思路:由于只包含1到9,所以只用记录乘积的质因数分解中,出现了多少2,3,5,7。题目中的$L1,R1$不超过$10^{18}$,可以计算出2最多为59个,3最多为37, 5最多为26,7最多为21。设$F[i][c_2][c_3][c_5][c_7]$表示考虑到第i位,乘积状态为$c_2,c_3,c_5,c_7$的数位DP情况。接着就是经典数位DP做法。空间可能比较紧,需要用滚动数组。

  (反正我只会记忆化搜索~>.^_^.<~)

代码:

/*Code by 520 -- 9.10*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
typedef pair<int,ll> P;
ll l,r,L,R;
int num[],top;
map<P,ll>f; ll dfs(int pos,int limit,ll tot){
if(!pos){if(tot==-)tot=;return L<=tot&&tot<=R;}
P state=(P){pos,tot};
if(!limit&&f[state]) return f[state]-;
ll tp=;
For(i,,limit?num[pos]:)
if(tot==-) tp+=i?dfs(pos-,limit&&i==num[pos],i):dfs(pos-,limit&&i==num[pos],-);
else tp+=dfs(pos-,limit&&i==num[pos],tot*i);
if(!limit) f[state]=tp+;
return tp;
} il ll solve(ll x){
if(x==-) return ;
top=;
while(x) num[++top]=x%,x/=;
return dfs(top,,-);
} int main(){
cin>>l>>r>>L>>R;
cout<<solve(r)-solve(l-);
return ;
}

NOIP赛前集训营-提高组(第一场)#B 数数字的更多相关文章

  1. 牛客网NOIP赛前集训营-提高组(第四场)B区间

    牛客网NOIP赛前集训营-提高组(第四场)B区间 题目描述 给出一个序列$ a_1  \dots   a_n$. 定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 ...

  2. 牛客网NOIP赛前集训营-提高组(第四场)游记

    牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...

  3. 牛客网NOIP赛前集训营-提高组(第四场)B题 区间

    牛客网NOIP赛前集训营-提高组(第四场) 题目描述 给出一个序列 a1, ..., an. 定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ...

  4. 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告

    目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...

  5. 牛客网NOIP赛前集训营-提高组(第一场)

    牛客的这场比赛感觉真心不错!! 打得还是很过瘾的.水平也比较适合. T1:中位数: 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l ...

  6. 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场

    第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...

  7. NOIP赛前集训营-提高组(第一场)#A 中位数

      题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l,r]表示,代表A[l], A[l + 1], ..., A[r]这段数.对于一 ...

  8. [牛客网NOIP赛前集训营-提高组(第一场)]C.保护

    链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...

  9. 牛客网NOIP赛前集训营-提高组(第一场)B 数数字

    数数字 思路: 数位dp 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...

随机推荐

  1. 【PaPaPa】系统架构搭建浅析 - 人人可以搭架构

    声明 [PaPaPa]这个项目是以技术分享与研究为目的而做的,并非商业项目,所以更多的是提供一种思路,请勿直接在项目中使用. 上一篇隐藏开源项目地址实属无奈,为了寻找一起做这件事的同伴不得已刷了一天推 ...

  2. lua编程之协程介绍

    一,lua协程简介 协程(coroutine),意思就是协作的例程,最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程属于侵入式组件,线程实现的系统称之为抢占式 ...

  3. 矩阵分解-----LDL分解

    若一个矩阵A是正定的,那么该矩阵也可以唯一分解为\[{\bf{A = LD}}{{\bf{L}}^{\bf{T}}}\] 其中L是对角元素都为1的下三角矩阵,D是对角元素都为正数的对角矩阵.还是以三维 ...

  4. Kubernetes 容器平台实战

    一.什么是Kubernetes? Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署,自动扩缩容,维护等功能. 通过Kubernetes可以做到: 快速部署应用 快 ...

  5. 【CodeForces-1041C】Coffee Break(二分解决关于set,pair,upper_bound用法)

    //题意:一个的工作时间是m分钟. // 在特定的时间和咖啡 n a1,a2....an,, ai代表的是每个咖啡要在一天中对应的时间点喝掉 // 每一次喝咖啡的时间为1分钟 // 必须在一天中的ai ...

  6. CSS命名规范(规则)常用的CSS命名规则

    CSS命名规范(规则)常用的CSS命名规则   CSS命名规范(规则)常用的CSS命名规则   头:header   内容:content/container   尾:footer ...

  7. 互评Alpha作品——Hello World!团队作品空天猎

    基于NABCD评论作品 1.Need需求:市面上同类型的手机及PC端飞行射击类游戏有很多,所以从需求方面来说,这款游戏的潜在客户非常有局限性.近些年较火的飞行射击类游戏,例如腾讯14年发行的<全 ...

  8. TeamWork#1,Week 5,Suggestions for Team Project

    我们团队联系到了我们六班的直系学长,并向他咨询了软件工程基础这门课的团队项目相关的问题.他们团队的名字命名为Z-XML,团队中的几个学长也都是我平时所熟识的.虽然学长已经大四,忙着考研工作等各种事务, ...

  9. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-中坚阶段

    2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-中坚阶段 如今的编写,进入了一段时间的中坚阶段,小伙伴的思路虽然很一致,但是总是存在着一定问题,这就造成了我们中坚阶 ...

  10. beat冲刺(6/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(6/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 ...