【CF55D】Beautiful numbers(动态规划)
【CF55D】Beautiful numbers(动态规划)
题面
题解
数位\(dp\)
如果当前数能够被它所有数位整除,意味着它能够被所有数位的\(lcm\)整除。
所以\(dp\)的时候前面所有数的\(lcm\)要压进\(dp\)值中。
又因为\(lcm\)的余数也是有意义的,但是又不能暴力记,
所以记录一下\([1,9]\)所有数的\(lcm\)也就是\(2520\)就好了。
但是数组太大,实际上,有意义的\(lcm\)个数只有不到\(50\)个,重新编号就可以压缩状态了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
inline ll read()
{
    ll x=0,t=1;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}
int lcm[3000],tot,p[50];
ll f[20][50][2520];
int W[20],top;
int LCM(int a,int b){if(b==0)return a;return a/__gcd(a,b)*b;}
ll dfs(int x,int Lcm,int r,int t)
{
	if(!x)return r%p[Lcm]==0;
	if(f[x][Lcm][r]!=-1&&!t)return f[x][Lcm][r];
	int up=t?W[x]:9;ll ret=0;
	for(int i=0;i<=up;++i)
		ret+=dfs(x-1,lcm[LCM(p[Lcm],i)],(r*10+i)%2520,t&(i==W[x]));
	if(!t)f[x][Lcm][r]=ret;
	return ret;
}
ll Solve(ll x)
{
	top=0;
	while(x)W[++top]=x%10,x/=10;
	return dfs(top,1,0,1);
}
int main()
{
	for(int i=0;i<(1<<9);++i)
	{
		int sum=1;
		for(int j=0;j<9;++j)
			if(i&(1<<j))sum=LCM(sum,j+1);
		lcm[sum]=1;
	}
	for(int i=1;i<=2520;++i)if(lcm[i])lcm[i]=++tot,p[tot]=i;
	memset(f,-1,sizeof(f));int T=read();
	while(T--)
	{
		ll l=read(),r=read();
		cout<<Solve(r)-Solve(l-1)<<endl;
	}
	return 0;
}
【CF55D】Beautiful numbers(动态规划)的更多相关文章
- 洛谷 CF55D Beautiful numbers 解题报告
		CF55D Beautiful numbers 题意 \(t(\le 10)\)次询问区间\([l,r](1\le l\le r\le 9\times 10^{18})\)中能被每一位上数整除的数的个 ... 
- [暑假集训--数位dp]cf55D Beautiful numbers
		Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer numb ... 
- CF55D Beautiful numbers 题解
		题目 Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer n ... 
- CF55D Beautiful numbers
		题目链接 题意 定义一个数字\(x\)是\(beautiful\ number\)当且仅当\(x\)可以被其十进制表示下所有非\(0\)位置的数整除. 例如\(24\)是一个\(beautiful\ ... 
- cf55D. Beautiful numbers(数位dp)
		题意 题目链接 Sol 看到这种题就不难想到是数位dp了. 一个很显然的性质是一个数若能整除所有位数上的数,则一定能整除他们的lcm. 根据这个条件我们不难看出我们只需要记录每个数对所有数的lcm(也 ... 
- CF55D Beautiful numbers (数位dp)
		题目链接 题解 一个数能被一些数整除,那么一定被这些数的\(lcm\)整除 那么我们容易想到根据\(lcm\)设状态 我们可以发现有用的\(lcm\)只有\(48\)个 那么按照一般的数位\(dp\) ... 
- 【数位DP】CF55D Beautiful numbers
		$dp[x][p][pp]$表示第x位,当前已有数字mod 2520(1~9数字的lcm)为p,当前各位数字的lcm为pp 观察到数组太大,考虑压缩,第三维lcm最多只有9个数字,打表发现最多只有48 ... 
- 【CF55D】Beautiful numbers
		[CF55D]Beautiful numbers 题面 洛谷 题解 考虑到如果一个数整除所有数那么可以整除他们的\(lcm\),而如果数\(x\)满足\(x\bmod Lcm(1,2...,9)=r\ ... 
- CodeForces 55D Beautiful numbers
		D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ... 
随机推荐
- replace与replaceAll的区别
			这两者有些人很容易搞混,因此我在这里详细讲述下. replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了 ... 
- 利用存储过程生成大量的数据(oracle,mysql)
			在进行查询操作的性能测试时,往往需要测试大数据量模式下的查询功能的性能,这是就需要我们去创造一些测试数据来填充数据库,来模拟真是环境,造数据的方式有很多种,可以使用loadrunner,jmeter等 ... 
- runtime如何实现weak属性
			首先了解weak是一种非拥有关系,属性所值对象销毁时,属性值会清空(nil). Runtime对注册的类会进行布局,对于weak对象会放入hash表中,用weak指向的内存地址作为key,当对象引用计 ... 
- java.lang.Boolean.valueOf(String s)
			简单说,就是s为true(这四个字母大小写任意)时,返回值为true,否则为false public class one { public static void main(String[] args ... 
- windows环境下apache-apollo服务器搭建及发布订阅测试
			查证了一些资料之后,发现 apache-apollo服务器使用的人还是挺多的,资料也比较齐全,所以直接选择 apache-apollo了,具体性能如何,先用起来再说吧: 1.下载 apache-apo ... 
- Unity FSM 有限状态机
			翻译了一下unity wiki上对于有限状态机的案例,等有空时在详细写一下.在场景中添加两个游戏物体,一个为玩家并修改其Tag为Player,另一个为NPC为其添加NPCControl脚本,并为其将玩 ... 
- TW实习日记:前三天
			今天是2018年7月20号,周五.从周一开始实习到现在,终于想起来要写日记这种东西了,可以记录一下自己这一天所学所做所知也是蛮不错的.先简单总结一下自己的大学生活吧,算是多姿多彩,体验了很多东西.在大 ... 
- 【坚持】Selenium+Python学习之从读懂代码开始 DAY1
			学习Selenium+Python已经好几个月了,但越学发现不懂的东西越多. 感觉最大的问题还是在于基础不扎实,决定从头开始,每天坚持读代码,写代码. 相信量变一定能到质变!!! 2018/05/09 ... 
- 虹软2.0版本离线人脸识别C#类库分享
			目前只封装了人脸检测部分的类库,供大家交流学习,肯定有问题,希望大家在阅读使用的时候及时反馈,谢谢!使用虹软技术开发完成 戳这里下载SDKgithub:https://github.com/dayAn ... 
- 当Kubernets遇上阿里云 -之七层负载均衡(一).
			我们知道Kubernetes的service只能实现基于4层的负载均衡,无法提供7层之上的许多特性,诸如基于URL的负载均衡,SSL支持,三方授权等等:Ingress可以实现七层负载均衡的许多功能,唯 ... 
