CF55D
题目大意:
定义:beautiful number,一种能整除它的所有非 0 数位的数字。
给你 l 和 r,请求出 [l,r] 中 beautiful number 的个数。
解题思路:
数位 DP 。
首先要指出的一点是:lcm(1,2,3, ... ,9) = 2520。则对于任何一个数 num,num = 2520k + num',我们有 num % 2520 % t = num' % t = num % t (t = 1,2,3, ... , 9),其实也不难理解:因为 2520k 必定被 t 整除,所以 num % t 其实就等于 num' % t 。下面是一个就 t % (x*n) % x = t % x 的严格证明:
设 t = k*x + t' 。则有 t%x = t' 。令 k = a*n+b,则 t % (x*n) % x = (k*x+t') % (x*n) % x = (a*n*x + b*x + t') % (n*x) % x = (b*x + t') % x = t' 。原等式得证。
如此一来,我们便可将所有的数字对着 2520 取一下模,压缩状态。
我们可以定义 dp[pos][now][prelcm]:其中 pos 表示当前遍历到的位置,now 表示当前数字的大小,prelcm 表示前面的几个数字的最小公倍数,如此我们需要定义 dp[20][2520][2521],虽然已经十分优秀,但似乎还有点大?其实我们还可以用离散化来优化一下:虽说 lcm(1,2,3, ... ,9) = 2520,但我们绝对不可能取尽这两千多个数,你说对吧?
至于其他的,其实就都是套路了,数位 DP 其实也是有套路滴~
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
typedef long long ll;
const int MOD = ;
ll index[MOD+];
ll dp[][MOD][];
int num[];
void init(){
int cnt=;
for(int i=;i<=MOD;i++){
if(MOD%i==) index[i]=cnt++;
}
}
ll gcd(ll a,ll b){
if(b==) return a;
return gcd(b,a%b);
}
ll lcm(ll a,ll b){
return a/gcd(a,b)*b;
}
ll dfs(int pos,int prelcm,int now,bool limit){
if(pos==-){
if(now%prelcm==) return ;
return ;
}
if(!limit&&dp[pos][now][index[prelcm]]!=-) return dp[pos][now][index[prelcm]];
int up=limit?num[pos]:;
ll ret=;
for(int i=;i<=up;i++){
int next=(now*+i)%MOD;
int tlcm=prelcm;
if(i) tlcm=lcm(tlcm,i);
ret+=dfs(pos-,tlcm,next,limit&&i==up);
}
if(!limit) dp[pos][now][index[prelcm]]=ret;
return ret;
}
ll solve(ll x){
if(x==) return ;
int ind=;
memset(num,,sizeof(num));
while(x){
num[ind++]=x%;
x/=;
}
return dfs(ind-,,,true);
}
int main()
{
init();
memset(dp,-,sizeof(dp));
ll l,r;
int t;
scanf("%d",&t); while(t--){
scanf("%I64d%I64d",&l,&r);
printf("%I64d\n",solve(r)-solve(l-));
}
return ;
}
CF55D的更多相关文章
- 洛谷 CF55D Beautiful numbers 解题报告
CF55D Beautiful numbers 题意 \(t(\le 10)\)次询问区间\([l,r](1\le l\le r\le 9\times 10^{18})\)中能被每一位上数整除的数的个 ...
- 【CF55D】Beautiful numbers(动态规划)
[CF55D]Beautiful numbers(动态规划) 题面 洛谷 CF 题解 数位\(dp\) 如果当前数能够被它所有数位整除,意味着它能够被所有数位的\(lcm\)整除. 所以\(dp\)的 ...
- 【CF55D】Beautiful numbers
[CF55D]Beautiful numbers 题面 洛谷 题解 考虑到如果一个数整除所有数那么可以整除他们的\(lcm\),而如果数\(x\)满足\(x\bmod Lcm(1,2...,9)=r\ ...
- CF55D Beautiful numbers
题目链接 题意 定义一个数字\(x\)是\(beautiful\ number\)当且仅当\(x\)可以被其十进制表示下所有非\(0\)位置的数整除. 例如\(24\)是一个\(beautiful\ ...
- cf55D 数位dp记忆化搜索+状态离散
/* 漂亮数定义:可以整除任意数位上的数 求出区间[l,r]之间的漂亮数个数 因为 dp[i][j][k]:i位前模lcm的值是j,i位前lcm是k的漂亮数个数 */ #include<bits ...
- cf55D. Beautiful numbers(数位dp)
题意 题目链接 Sol 看到这种题就不难想到是数位dp了. 一个很显然的性质是一个数若能整除所有位数上的数,则一定能整除他们的lcm. 根据这个条件我们不难看出我们只需要记录每个数对所有数的lcm(也 ...
- CF55D: Beautiful Number
传送门 一句话题意 求 l~r 之间有多少个数能整除自己各位上的数(排除 0 ) 分析 然后我们一看就知道数位 dp ,但是状态很难设计啊 QWQ 我们可以发现所有数位的 lcm 最大为 2520 ( ...
- [暑假集训--数位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 [数位DP]$
题面 数位DP+状压. 首先,按照数位DP的基本套路,每个个位数的最小公倍数为2520,所以只用考虑模2520的情况.考虑一个DP.dp[i][j][k]表示当前是第i位,2~9的数的集合为j,模25 ...
- CF55D Beautiful numbers (数位dp)
题目链接 题解 一个数能被一些数整除,那么一定被这些数的\(lcm\)整除 那么我们容易想到根据\(lcm\)设状态 我们可以发现有用的\(lcm\)只有\(48\)个 那么按照一般的数位\(dp\) ...
随机推荐
- Android 5.0系统默认颜色
伴随着 Android5.0 的发布也更新了support-v7-appcompat 到 V21,其中增加了 ToolBar.recyclerview.cardview 等控件. Android5.0 ...
- Omnicore RPC API中文文档
2019独角兽企业重金招聘Python工程师标准>>> OmniCore是比特币核心的一个分支,它在比特币协议之上实现了一个新的Omni协议层,用于代币发行.众售等应用,USDT就是 ...
- Bubble Cup 11 - Finals [Online Mirror, Div. 1]题解 【待补】
Bubble Cup 11 - Finals [Online Mirror, Div. 1] 一场很好玩的题啊! I. Palindrome Pairs 枚举哪种字符出现奇数次. G. AI robo ...
- handlebars模板引擎使用初探1
谈到handlebars,我们不禁产生疑问,为什么要使用这样的一个工具呢?它究竟能为我们带来什么样的好处?如何使用它呢? 一.handlebars可以干什么? 首先,我们来看一个案例: 有这样的htm ...
- shell之路 shell核心语法【第四篇】流程控制
if语句 if ... fi 语句: if ... else ... fi 语句: if ... elif ... else ... fi 语句. 注意: expression 和方括号([ ])之间 ...
- Bootstrap初识
目录 概述 快速入门 响应式布局 CSS样式和JS插件 全局CSS样式 组件 插件 案例:黑马旅游网 概述 概念:一个前端开发的框架,Bootstrap是美国Twitter公司的设计师Mark Ott ...
- Matlab矩阵总结
- JAVA基础篇 之 类的初始化
类中属性的隐式初始化,代码如下,我们看下不同类型默认的初始值是什么 创建一个Demo类如下: class Demo { int a; byte b; short c; long d; boolean ...
- 中文分词工具简介与安装教程(jieba、nlpir、hanlp、pkuseg、foolnltk、snownlp、thulac)
2.1 jieba 2.1.1 jieba简介 Jieba中文含义结巴,jieba库是目前做的最好的python分词组件.首先它的安装十分便捷,只需要使用pip安装:其次,它不需要另外下载其它的数据包 ...
- docker redis shell
docker中安装好redis后,运行 docker ps 指令,查看所有运行中的镜像信息 然后运行 docker inspect --format "{{ .State.Pid}}&quo ...