题目大意:

  定义: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的更多相关文章

  1. 洛谷 CF55D Beautiful numbers 解题报告

    CF55D Beautiful numbers 题意 \(t(\le 10)\)次询问区间\([l,r](1\le l\le r\le 9\times 10^{18})\)中能被每一位上数整除的数的个 ...

  2. 【CF55D】Beautiful numbers(动态规划)

    [CF55D]Beautiful numbers(动态规划) 题面 洛谷 CF 题解 数位\(dp\) 如果当前数能够被它所有数位整除,意味着它能够被所有数位的\(lcm\)整除. 所以\(dp\)的 ...

  3. 【CF55D】Beautiful numbers

    [CF55D]Beautiful numbers 题面 洛谷 题解 考虑到如果一个数整除所有数那么可以整除他们的\(lcm\),而如果数\(x\)满足\(x\bmod Lcm(1,2...,9)=r\ ...

  4. CF55D Beautiful numbers

    题目链接 题意 定义一个数字\(x\)是\(beautiful\ number\)当且仅当\(x\)可以被其十进制表示下所有非\(0\)位置的数整除. 例如\(24\)是一个\(beautiful\ ...

  5. cf55D 数位dp记忆化搜索+状态离散

    /* 漂亮数定义:可以整除任意数位上的数 求出区间[l,r]之间的漂亮数个数 因为 dp[i][j][k]:i位前模lcm的值是j,i位前lcm是k的漂亮数个数 */ #include<bits ...

  6. cf55D. Beautiful numbers(数位dp)

    题意 题目链接 Sol 看到这种题就不难想到是数位dp了. 一个很显然的性质是一个数若能整除所有位数上的数,则一定能整除他们的lcm. 根据这个条件我们不难看出我们只需要记录每个数对所有数的lcm(也 ...

  7. CF55D: Beautiful Number

    传送门 一句话题意 求 l~r 之间有多少个数能整除自己各位上的数(排除 0 ) 分析 然后我们一看就知道数位 dp ,但是状态很难设计啊 QWQ 我们可以发现所有数位的 lcm 最大为 2520 ( ...

  8. [暑假集训--数位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 ...

  9. $CF55D [数位DP]$

    题面 数位DP+状压. 首先,按照数位DP的基本套路,每个个位数的最小公倍数为2520,所以只用考虑模2520的情况.考虑一个DP.dp[i][j][k]表示当前是第i位,2~9的数的集合为j,模25 ...

  10. CF55D Beautiful numbers (数位dp)

    题目链接 题解 一个数能被一些数整除,那么一定被这些数的\(lcm\)整除 那么我们容易想到根据\(lcm\)设状态 我们可以发现有用的\(lcm\)只有\(48\)个 那么按照一般的数位\(dp\) ...

随机推荐

  1. CSS样式3

    1.positon:fixed 可以实现网页浏览器上的返回顶部的功能. positon:fixed 表示将当前div块固定在页面的某一个位置(默认为左上角). <!DOCTYPE html> ...

  2. Golang-filepath使用

    Golang-filepath 使用 获取当前目录 os.GetPWD() filepath.Abs(path) # 绝对目录 filepath.Dir(path) # 相对目录 可以 filepat ...

  3. Tomcat 8 Host-Manager配置访问的方法,全网唯一正确配置

    2019独角兽企业重金招聘Python工程师标准>>> 环境: 操作系统:         Linux version 2.6.32-696.10.1.el6.x86_64 (moc ...

  4. 解决vue渲染时闪烁{{}}的问题

    原文转自: 点我 Vue页面加载时v-show设置的隐藏元素出现导致页面闪烁问题在写APP社区页面的时候在一些地方用了v-show,在刷新页面的时候就发现即便在逻辑判断为false某些元素不该显示时也 ...

  5. 数学--数论--HDU 12151七夕节

    七夕节 Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!&q ...

  6. 图论-网络流-Dinic (邻接表版)

    //RQ的板子真的很好用 #include<cstdio> #include<cstring> #include<queue> #define INF 1e9 us ...

  7. asyncio异步编程【含视频教程】

    不知道你是否发现,身边聊异步的人越来越多了,比如:FastAPI.Tornado.Sanic.Django 3.aiohttp等. 听说异步如何如何牛逼?性能如何吊炸天....但他到底是咋回事呢? 本 ...

  8. 记一次jackson序列化Boolean的坑

    @Data public class CouponTemplateDto { /** * 优惠券类型id */ private Long couponTypeId; /** * 优惠券模板id */ ...

  9. MySQL连接不上

    access denied for user root @localhost 解决办法: create user 'root'@'localhost' identified by '你的密码'; gr ...

  10. ASP.NET Core on K8S学习之旅(12)Ingress

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Ingress Kubernetes对外暴露Service主要有三种方 ...