NOIP赛前集训营-提高组(第一场)#B 数数字
题目描述
输入描述:
第一行四个整数L,R,L1,R1。
输出描述:
一行一个整数,代表小N想知道的数的数量。
备注:
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 数数字的更多相关文章
- 牛客网NOIP赛前集训营-提高组(第四场)B区间
牛客网NOIP赛前集训营-提高组(第四场)B区间 题目描述 给出一个序列$ a_1 \dots a_n$. 定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 ...
- 牛客网NOIP赛前集训营-提高组(第四场)游记
牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...
- 牛客网NOIP赛前集训营-提高组(第四场)B题 区间
牛客网NOIP赛前集训营-提高组(第四场) 题目描述 给出一个序列 a1, ..., an. 定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ...
- 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告
目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...
- 牛客网NOIP赛前集训营-提高组(第一场)
牛客的这场比赛感觉真心不错!! 打得还是很过瘾的.水平也比较适合. T1:中位数: 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l ...
- 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场
第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...
- NOIP赛前集训营-提高组(第一场)#A 中位数
题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l,r]表示,代表A[l], A[l + 1], ..., A[r]这段数.对于一 ...
- [牛客网NOIP赛前集训营-提高组(第一场)]C.保护
链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...
- 牛客网NOIP赛前集训营-提高组(第一场)B 数数字
数数字 思路: 数位dp 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...
随机推荐
- node的 node-sass@^4.11.0 出现:npm: no such file or directory, scandir '.../node_modules/node-sass/vendor'
解决办法: 查看node_modules文件夹,发现,并无vender 文件夹.如下图: 2. 在 node_modules/node-sass 下创建 vendor 文件夹 3. 最后运行: n ...
- [Java] Design Pattern:Code Shape - manage your code shape
[Java] Design Pattern:Code Shape - manage your code shape Code Shape Design Pattern Here I will intr ...
- d-ary heap实现一个快速的优先级队列(C#)
d-ary heap简介: d-ary heap 是泛化版本的binary heap(d=2),d-ary heap每个非叶子节点最多有d个孩子结点. d-ary heap拥有如下属性: 类似comp ...
- 在CentOS7上部署PostgreSQL11数据库系统
在数据库上的选择,也是基于了稳定性为前提.其实选择的范围并不是太大,基本可以选择的范围也就是SQLServer.MySQL.PostgreSQL这三种.SQL Server是微软的商业数据库,无论是性 ...
- jenkins的时间与服务器的时间不一致
解决办法:
- Netty源码分析第5章(ByteBuf)---->第8节: subPage级别的内存分配
Netty源码分析第五章: ByteBuf 第八节: subPage级别的内存分配 上一小节我们剖析了page级别的内存分配逻辑, 这一小节带大家剖析有关subPage级别的内存分配 通过之前的学习我 ...
- 如何在window服务器上搭建一个能代替ftp的传输工具
通常对于服务器上的文件管理和数据传输都是利用ftp来实现,但随着存储技术的发展,数据资产的存储规模和复杂程度不断提高,传统的ftp传输显得有笨重.今天给大家介绍一款能够取代ftp的在线文档管理软件—— ...
- watch命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/kaishirenshi/p/7727986.html watch 命令详解: author:headsen chen ...
- PSP Daily新增功能说明书
1.选择输入类别时可以记录原来的输入,支持用户选择记录清空功能 2.添加“恢复最近”button,点击这个按钮可以跳出一个页面显示最近的excel记录,用户可以通过勾选相应的excel文件名,恢复选中 ...
- 20162328蔡文琛 大二 十二周课上测试 hash