Codeforces 55D. Beautiful numbers(数位DP,离散化)
Codeforces 55D. Beautiful numbers
题意
求[L,R]区间内有多少个数满足:该数能被其每一位数字都整除(如12,24,15等)。
思路
一开始以为是数位DP的水题,觉得只需要记录搜到当前位出现了哪些数字作为状态即可,明显是假算法...感觉这是一道数位DP好题。可以这样思考:一个数要想被其各位数字分别都整除,等价于它被那些数字的LCM整除。因此记录当前位,当前数对(1~9的LCM)取模的结果,当前出现的数字的LCM这三个值作为状态才合理,即dp[pos][sum][lcm]。不过有一点需要注意,1-9的LCM的值会达到2520,直接存的空间复杂度是不对的,而1-9的数字任意组合的LCM明显没有那么多个,因此考虑离散化这些LCM,即可压缩空间。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<cmath>
#include<functional>
#include<string>
#define dd(x) cout<<#x<<" = "<<x<<" "
#define de(x) cout<<#x<<" = "<<x<<"\n"
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> P;
typedef priority_queue<int> BQ;
typedef priority_queue<int,vector<int>,greater<int> > SQ;
const int maxn=5e3+10,mod=1e9+7,INF=0x3f3f3f3f;
int LCM,dig[30],id[maxn];
ll dp[30][maxn][100];
ll gcd(ll a,ll b)
{
	return b==0?a:gcd(b,a%b);
}
ll Lcm(ll a,ll b)
{
	return a*b/gcd(a,b);
}
void init()
{
	int num=0;
	LCM=1;
	for (int i=1;i<=9;++i)
		LCM=Lcm(LCM,i);
	for (int i=1;i<=LCM;++i)
		if (LCM%i==0)
			id[i]=num++;
	memset(dp,-1,sizeof(dp));
}
ll dfs(int pos, int sum, int lcm, int lit)
{
	if (pos==-1)
		return sum%lcm==0;
	if (!lit&&dp[pos][sum][id[lcm]]!=-1)
		return dp[pos][sum][id[lcm]];
	int up=lit?dig[pos]:9;
	ll cnt=0;
	for (int i=0;i<=up;++i)
	{
		int ns=(sum*10+i)%LCM,nl=i==0?lcm:Lcm(lcm,i);
		cnt+=dfs(pos-1,ns,nl,lit&&i==dig[pos]);
	}
	if (!lit)
		dp[pos][sum][id[lcm]]=cnt;
	return cnt;
}
ll count(ll n)
{
	int pos=0;
	while (n)
	{
		dig[pos++]=n%10;
		n/=10;
	}
	return dfs(pos-1,0,1,1);
}
int main()
{
	init();
	int T;
	cin>>T;
	while (T--)
	{
		ll l,r;
		cin>>l>>r;
		cout<<count(r)-count(l-1)<<endl;
	}
	return 0;
}
Codeforces 55D. Beautiful numbers(数位DP,离散化)的更多相关文章
- codeforces 55D - Beautiful numbers(数位DP+离散化)
		D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ... 
- CodeForces - 55D - Beautiful numbers(数位DP,离散化)
		链接: https://vjudge.net/problem/CodeForces-55D 题意: Volodya is an odd boy and his taste is strange as ... 
- CodeForces - 55D Beautiful numbers —— 数位DP
		题目链接:https://vjudge.net/problem/CodeForces-55D D. Beautiful numbers time limit per test 4 seconds me ... 
- Codeforces - 55D Beautiful numbers (数位dp+数论)
		题意:求[L,R](1<=L<=R<=9e18)区间中所有能被自己数位上的非零数整除的数的个数 分析:丛数据量可以分析出是用数位dp求解,区间个数可以转化为sum(R)-sum(L- ... 
- codeforces 55D. Beautiful numbers  数位dp
		题目链接 一个数, 他的所有位上的数都可以被这个数整除, 求出范围内满足条件的数的个数. dp[i][j][k], i表示第i位, j表示前几位的lcm是几, k表示这个数mod2520, 2520是 ... 
- FZU2179/Codeforces 55D beautiful number  数位DP
		题目大意: 求 1(m)到n直接有多少个数字x满足 x可以整出这个数字的每一位上的数字 思路: 整除每一位.只需要整除每一位的lcm即可 但是数字太大,dp状态怎么表示呢 发现 1~9的LCM 是2 ... 
- CF 55D. Beautiful numbers(数位DP)
		题目链接 这题,没想出来,根本没想到用最小公倍数来更新,一直想状态压缩,不过余数什么的根本存不下,看的von学长的blog,比着写了写,就是模版改改,不过状态转移构造不出,怎么着,都做不出来. #in ... 
- CodeForces 55D "Beautiful numbers"(数位DP+离散化处理)
		传送门 参考资料: [1]:CodeForces 55D Beautiful numbers(数位dp&&离散化) 我的理解: 起初,我先定义一个三维数组 dp[ i ][ j ][ ... 
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J  Beautiful Numbers  (数位DP)
		2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP) 链接:https://ac.nowcoder.com/acm/contest/163/ ... 
随机推荐
- uva 10325基础容斥
			题目:给你一个数n以及m个数字,问1~n中不能被这m个数字整除的数字的个数. 分析:容斥原理.组合数学.数字1-n中能被a.b整除的数字的个数分别是n/a,n/b: 则1-n中能被a或b整数的数字个数 ... 
- JAVA中ArrayList重写比较方法
			ArrayList的sort方法重写: 当ArrayList中存放的为含有多个成员变量的数据类型时,在进行sort排序时要重写比较方法,一般都写在这个数据类型类的内部如: package 算法竞赛入门 ... 
- 三  HashSet
			HashSet无序且不能重复 1.HashSet类的字段属性 //HashSet集合中的内容是通过 HashMap 数据结构来存储的 private transient HashMap<E,Ob ... 
- JAVA对ArrayList排序
			ava如何对ArrayList中对象按照该对象某属性排序 增加排序功能,打印时:输出学生对象的时候,需要先按照年龄排序,如果年龄相同,则按照姓名排序,如果姓名也相同,则按照学号排序. Code hig ... 
- 2.1 使用JAXP 对 xml文档进行DOM解析
			//使用 jaxp 对xml文档进行dom解析 public class Demo2 { //必要步骤 @Test public void test() throws Exception { //1. ... 
- 简单服务器通信 模型socketserver
			硬件服务器:主机 集群 厂商 :IBM HP 联想 浪潮 软件服务器 :编写的服务端应用程序,在硬件服务器上运行,一般依托于操作系统,给用户提供一套完整的服务 httpserver --> ... 
- PhpStorm添加PHP代码规范检查CodeSniffer(phpcs)和PHP代码静态分析工具Mess Detector(phpmd)
			一.安装 添加镜像,加速下载 ./composer.phar config -g repo.packagist composer https://packagist.phpcomposer.com ... 
- (二十五)防编译后函数名通过ida查看到
			在使用多个动态库时,两个动态库之间有可能存在相同名称的函数,这样会出现只有第一个函数生效,即所有对该函数的调用都将指向第一个加载的动态库的同名函数中.这样就会很混乱,而且在想改名称也不是很简单的情况下 ... 
- PendSV异常介绍、用于上下文切换
			在这里,非常感谢<cortex-cm3权威指南>的翻译者. PendSV 的典型使用场合是在上下文切换时(在不同任务之间切换). 例如, 一个系统中有两个就绪的任务,上下文切换被触发的场合 ... 
- 封装Server类和Client类
			服务器端: EasyTcpServer.hpp #ifndef _EasyTcpServer_hpp_ #define _EasyTcpServer_hpp_ #ifdef _WIN32 #defin ... 
