CF .Beautiful numbers 区间有多少个数字是可以被它的每一位非零位整除。(数位DP)
题意:数字满足的条件是该数字可以被它的每一位非零位整除。
分析:大概的思路我是可以想到的 , 但没有想到原来可以这样极限的化简 , 在数位dp 的道路上还很长呀 ;
我们都知道数位dp 的套路 , 核心的部分就是找到判断这个数的满足条件的方法 , 如果找到了那这个问题就迎刃而解了吧 ;
这个题的条件是数字被每一位非零的数整除,那是不是这个是应该被每一位的最小公倍数整除 ,这里是这道题目的关键!!!!!!!! 1-9的最小公倍数是2520 , 所以其他位数最公倍数都是在2520内的(看这样考虑的话 dp数组只要开2520就好了 ,牛逼!!!)
dfs( pos , num , lcm , limit) : 在第几位 , 当前的数字,当前数字所有非零位的最小公倍数,是否限制。
下面关键的地方又来了: 因为我们枚举完判断是num%lcm是否为0 , 所以!!每次传入num都%2520!! ,这样数组又可以开小了许多 ;
但是因为我们的dp[pos][num][lcm] , 19*2520*2520 , 这个是无法开的 , 那我们这么办呢??
又是一个关键!这里居然用到离散化 !! 牛逼! 所以对于lcm这一维我们需要进行离散化,经过打表可以发现,2520内可以整除2520的只有48个,所以我们可以离散化一下让lcm映射到1-48既可以了这样就可以开19x2520x48大小的了。1-2520中可能是最小公倍数的其实只有48个,经过离散化处理后,dp数组的最后一维可以降到48,这样就不会超了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MOD = ;
int Hash[];
int digit[];
ll dp[][][];
void init(){
int cnt = ;
for(int i = ; i <= MOD; i++){
if(MOD % i == )
Hash[i] = cnt++;
}
}
ll gcd(ll a,ll b){
if(!b)
return a;
else return gcd(b,a%b);
}
ll dfs(int pos,int num,int lcm,int limit){
if(pos == -)
return num % lcm == ;
ll &dpnow = dp[pos][num][Hash[lcm]];
if(!limit && dpnow != -)
return dpnow;
int max_digit = limit ? digit[pos] : ;
ll ans = ;
for(int i = ; i <= max_digit; i++){
ans += dfs((pos - ), ((num * + i) % MOD), (!i ? lcm : lcm * i / gcd(lcm,i)), (limit && i == max_digit));
}
if(!limit) dpnow = ans;
return ans;
}
ll solve(ll n){
int pos = ;
while(n){
digit[pos++] = n % ;
n /= ;
}
return dfs(pos-,,,);
}
int main(){
init();
int t;
cin >> t;
memset(dp,-,sizeof(dp));
while(t--){
ll l,r;
cin >> l >> r;
cout << solve(r) - solve(l-) << endl;
}
return ;
}
CF .Beautiful numbers 区间有多少个数字是可以被它的每一位非零位整除。(数位DP)的更多相关文章
- CodeForces 55D "Beautiful numbers"(数位DP+离散化处理)
传送门 参考资料: [1]:CodeForces 55D Beautiful numbers(数位dp&&离散化) 我的理解: 起初,我先定义一个三维数组 dp[ i ][ j ][ ...
- BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1833 统计\(a~b\)中数字\(0,1,2,...,9\)分别出现了多少次. 分析 数位dp ...
- 1009 数字1的数量 数位dp
1级算法题就这样了,前途渺茫啊... 更新一下博客,我刚刚想套用数位dp的模板,发现用那个模板也是可以做到,而且比第二种方法简单很多 第一种方法:我现在用dp[pos][now]来表示第pos位数字为 ...
- CF 55D - Beautiful numbers(数位DP)
题意: 如果一个数能被自己各个位的数字整除,那么它就叫 Beautiful numbers.求区间 [a,b] 中 Beautiful numbers 的个数. 分析:先分析出,2~9 的最大的最小公 ...
- CF 55 D. Beautiful numbers
D. Beautiful numbers 链接 题意: 求[L,R]中多少个数字可以整除它们的每一位上的数字. 分析: 要求模一些数字等于0等价于模它们的lcm等于0,所以可以记录当前出现的数字的lc ...
- HDU 4352 区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K(数位DP+LIS)
题目:区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K 思路:用dp[i][state][j]表示到第i位状态为state,最长上升序列的长度为k的方案数.那么只要模拟nlogn写法的 ...
- CF 给你三个数字L, R, K,问在[L, R]范围内有多少个数字满足它每一位不同数字不超过k个,求出它们的和(数位DP)
题意: 给你三个数字L, R, K,问在[L, R]范围内有多少个数字满足它每一位不同数字不超过k个,求出它们的和 分析:考虑用状态压缩 , 10给位0~9 , 如果之前出现过了某个数字x ,那就拿当 ...
- CF D. Beautiful numbers (数位dp)
http://codeforces.com/problemset/problem/55/D Beautiful Numbers : 这个数能整除它的全部位上非零整数.问[l,r]之间的Beautifu ...
- 【数位dp】CF 55D Beautiful numbers
题目 Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer n ...
随机推荐
- MongoDB中的查询
MongoDB中文文档:http://docs.mongoing.com/manual-zh/contents.html 这里以集合名称为test为例,数据库通过for循环插入一些测试数据,键分别为: ...
- [Python Study Notes]折线图绘制
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- 在JAVA中,String,Stringbuffer,StringBuilder 的区别
首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String 不是线程安全的,这意味着在不同线程共享一个String ...
- [poj3159]Candies(差分约束+链式前向星dijkstra模板)
题意:n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果 解题关键:差分约束系统转化为最短路,B-A>=C,建有向边即可,与 ...
- c++的单例模式及c++11对单例模式的优化
单例模式 单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目.但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况,可能会优先考虑使用全局或者静态 ...
- js实现上传单个文件
js上传文件:js 上传单个文件(任意大小) 疯狂代码 http://www.CrazyCoder.cn/ :http:/www.CrazyCoder.cn/Javascript/Article832 ...
- SDUT 3379 数据结构实验之查找七:线性之哈希表
数据结构实验之查找七:线性之哈希表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 根据给定 ...
- 关于windows2012-远程复制粘贴无效的解决方法
1:在远程桌面中右键点击,选择启动任务管理器,杀掉进程 2:重启服务即可:
- EF中的MySql返回 DataTable公共类库
public static class SqlHelper { /// <summary> /// EF SQL 语句返回 dataTable /// </summary> / ...
- SQL CTE 递归 查询省,市,区
IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb ) , pid ) , name )) ' , null , '广东省') ' , '广州市') ' , '深 ...