codeforces 55D Beautiful numbers(数位dp)

CodeForces 55D-Beautiful numbers【数位DP+思维】 题目链接:https://codeforces.com/problemset/problem/55/D 题意: Volodya 是一个古怪的男孩,他的品味与众不同。对他来说,一个正整数是漂亮数,当且仅当它能够被自身的各非零数字整除。我们不必与之争辩,只需计算给定范围中有多少个漂亮数。 输入 输入的第一行包含了测试用例的数目t(1 ≤ t ≤ 10)。接下来的t行,每行包含两个自... 阅读详情

Beautiful numbers

题目链接:

http://codeforces.com/problemset/problem/55/D

解题思路:

题目大意:

求区间[x , y]中beautiful number的个数,a positive integer number is beautiful if and only if it is divisible by each of its nonzero digits.

算法思想:

一个数能被它的所有非零数位整除,则它一定能被它们的最小公倍数整除,而1到9的最小公倍数为2520,所以数位dp时我们只需保存前面那些位的最小公倍数就可进行状态转移即可,到边界时就把所有位的lcm求出了。为了判断这个数能否被它的所有数位整除,我们还需要这个数的值,显然要记录值是不可能的,其实我们只需记录它对2520的模即可,这样我们就可以设计出如下数位dp:dfs(pos,premod,prelcm,f),pos为当前位,premod为前面那些位对2520的模,prelcm为前面那些数位的最小公倍数,f标记前面那些位是否达到上限,这样一来dp数组就要开到19*2520*2520,明显超内存了,考虑到最小公倍数是离散的,1-2520中可能是最小公倍数的其实只有48个,经过离散化处理后,dp数组的最后一维可以降到48,这样就不会超了。

AC代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn = 20;
const int MOD = 2520;
ll dp[maxn][MOD][50];
int digit[maxn],index[MOD+5];

int GCD(int a,int b){
    if(b == 0)
        return a;
    return GCD(b,a%b);
}

int LCM(int a,int b){
    return a/GCD(a,b)*b;
}

ll dfs(int pos,int premod,int prelcm,bool edge){
    if(pos == -1)
        return (premod%prelcm) == 0;
    if(!edge && dp[pos][premod][index[prelcm]] != -1)
        return dp[pos][premod][index[prelcm]];
    int tmp = edge?digit[pos]:9;
    ll ans = 0;
    for(int i = 0; i <= tmp; i++){
        int nowlcm = prelcm;
        int nowmod = (premod*10 + i)%MOD;
        if(i)
            nowlcm = LCM(prelcm, i);
        ans += dfs(pos - 1, nowmod, nowlcm, edge && i == tmp);
     }
     if(!edge)
            dp[pos][premod][index[prelcm]] = ans;
     return ans;
}

ll cal(ll x){
    int pos = 0;
    while(x){
        digit[pos++] = x%10;
        x /= 10;
    }
    return dfs(pos-1,0,1,1);
}

void init(){
    int cnt = 0;
    memset(dp,-1,sizeof(dp));
    for(int i = 1; i <= MOD; i++){
        if(MOD%i == 0)
            index[i] = cnt++;
    }
}
int main(){
    init();
    int T;
    scanf("%d",T);
    while(T--){
        ll l,r;
        scanf("%I64d%I64d",&l,&r);
        printf("%I64d\n",cal(r)-cal(l-1));
    }
    return 0;
}


【数位DP】Beautiful numbers CodeForces - 55D 阅读详情

相关推荐

通讯接口应用笔记3:使用W5500实现Modbus TCP服务器

  前面我们设计实现了W5500的驱动程序,也讲解了驱动的使用方式。在最近一次的项目应用中,正好有一个使用W5500实现TCP通讯的需求,所以我们就使用该驱动程序轻松实现。这一篇中我们就来说一说基于我们W5500通讯驱动程序实现TCP通讯的过程。 1、应用需求   在本次应用中,要求实现一个基于W5500的Modbus TCP服务器。这个需求的描述虽然只有一句话,但是这个需求的内容可不简单。我们首先来分析一下这个需求的具体内容。   为了实现基于W5500的Modbus TCP服务器,我们必先须基于W550

木南创智 5495

Codeforces 55D Beautiful numbers 数位dp

http://codeforces.com/problemset/problem/55/D 题意: 要你求在A到B区间内的所有beautiful数,beautifil数的定义是这个数能被它自身数位上的所有数整除。 思路: 很好的一道数位dp的题目,大致的想法是这样的:首先我们可以知道一个数要能被它的所有数位上的非零数整除,那么这个数就必须要能被这个数中出现过的所有数字的最小公倍数整除,这样

Chris_Home 1323

Matlab路径文件pathdef.m可能为只读文件修改方法

找到MATLAB目录下的bin这个文件夹,直接改这个文件夹的权限(之前试过改pathdef.m的权限,不好用)如果到这里重新导入还是不行,从官网重新下载需要的安装包,可能是你的安装包出了问题。(Win11系统,matlab版本为2022b)编辑——添加——在输入对象名称来选择中输入everyone。重启matlab,以管理员身份运行。并修改其他已有的权限,都给它。

yqc1123的博客 1万+

Codeforces 55D Beautiful numbers (数位DP)

题意:有T组询问,每次询问区间[l, r]中的beautiful number有多少。beautiful number是指这个数可以被组成它的数字整除。例如15是beautiful number,因为15可以被1整除,也可以被5整除。25不是beautiful number, 25不能被2整除。 思路:很明显和数位有关,肯定是数位DP,然而题目中的这个条件不太好状态转移。题目中要求beautif...

weixin_30276935的博客 2607

从Transformer到Mamba:显著性检测领域的计算效率革命(Samba框架深度解析)

本文深入解析了Samba框架在显著性目标检测(Salient Object Detection)领域的创新应用,通过结合Mamba架构的优势,实现了计算效率的革命性提升。Samba框架采用显著性引导的Mamba模块(SGMB)和上下文感知上采样(CAU),有效解决了传统CNN和Transformer的局限性,同时在RGB-D等多模态任务中展现出卓越性能。

mmm90的博客 557

手把手教你用手机号注册的Apple ID成功登录Developer账户(避坑指南)

本文详细解析了使用手机号注册的Apple ID登录开发者账户时常见的'不符合使用条件'报错问题,并提供了从添加可验证邮箱到设置主账号的四步解决方案。特别针对Apple Developer账户的验证机制,帮助开发者避免因邮箱缺失导致的登录失败,提升账户激活成功率。

z5a6b的博客 1215

【数位dp】Beautiful numbers CodeForces - 55D

Beautiful numbers  CodeForces - 55D 碰到的第二类数位dp的问题:求被整除的个数 这一种不同的特征在于余数,所以将余数作为dp的变量。 这题比较麻烦,题意简单的来说是:找(非0)的所有位数都能整除这个数的数。 要使所有非0位数整除这个数,那么 这个数%这些非0位数的最小公倍数==0。 那么不同的特征不仅在余数,还有最小公倍数上。 因为最小公

学无纸巾 328

VisionMaster位置修正功能深度解析:如何让找圆工具自动跟随移动目标?

本文深度解析海康威视VisionMaster平台的位置修正功能,重点介绍如何通过模板匹配与找圆工具的智能联动实现移动目标的动态追踪。文章详细阐述了工业视觉检测中的坐标系同步原理、模板匹配配置技巧及异常处理策略,为工程师提供了一套完整的工业级解决方案。

uu89012的博客 280

数位DP codeforces55(D)-Beautiful numbers

数位DP: 用来统计区间内符合条件的数的个数,通常区间范围很大,并且条件通常与数的组成有关。 解题关键:对前缀的抽象分类。须符合两个条件。 对于一个数anan-1……a2a1a0, 可以将前缀anan-1…ak+1归类于状态(sta,k), 使得具有相同状态的前缀的解一致。 可以求解,在状态(sta,k)下,dkdk-1…d1d0中符合条件的数字的个数。 实现方法是记忆化搜索。dp[k][...

wuzy38的博客 413

huggingface使用git上传model或者Dataset到HF,当然也可以上传代码,以及大文件,很哇塞!!!

huggingface使用git上传model或者Dataset到HF,当然也可以上传代码,以及大文件,很哇塞!!! 第一次使用时,需要使用设置系统全局的huggingface token,这。点击huggingface首页右上角的头像 → settings → access tokens,创建一个write权限的token,名字可以随便取。

拥抱具身智能,昇腾Ascend C 3104

C#实现鼠标点击任意绝对位置(附完整源码)

C#实现鼠标点击任意绝对位置(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 476

codeforces 55D Beautiful numbers[数位dp]

D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Volodya is an odd boy and his taste is

code_or_code 775

NLTK中WordNet与同义词处理

通过本教程,学习了如何使用NLTK中的WordNet进行自然语言处理任务。首先介绍了WordNet的基本概念及其在NLTK中的集成使用,接着讲解了如何查找同义词、反义词等词汇关系,并结合实际应用演示了语义相似性计算。这些技能在文本分析、情感分析、信息检索等场景中有广泛应用,可以帮助开发者构建更智能的自然语言处理系统。掌握这些基本操作后,可以进一步探索WordNet的其他高级功能,结合其他NLTK工具进行更复杂的语言分析。

Mr数据杨 471

Codeforces 55D Beautiful numbers 数位DP

自从去年4月份学姐教完我数位DP,还是第一次写出这么漂亮的代码,也是醉了。 首先你要知道sum%(x*n) %x == sum%x,这样就可以在dfs的时候记录2到9的最小公倍数2540取余了。 #include #include #include #include #include #include #include #include #include #pragma c

自在飞花 822

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

CodeForces - 55D Beautiful numbers —— 数位DP

题目链接:https://vjudge.net/problem/CodeForces-55D D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard ou...

alince20008的博客 179

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Codeforces 55D Beautiful Numbers(数位dp,能被自己各个位上数字整除的数字个数)

题目链接: Codeforces 55D Beautiful Numbers 题意: 定义:一个数如果能够被它所有位上非零数字整除那么这个数就是Beautiful Numbers。 给一个区间[L,R][L,R],求这个区间Beautiful Numbers的个数。 数据范围:1≤L≤R≤9∗10181\leq L\leq R\leq 9*10^{18} 分析: 这道题清新脱俗啊~

ramay7 1606

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

CodeForces 55D Beautiful numbers(数位dp)

E -Beautiful numbers Time Limit:4000MSMemory Limit:262144KB64bit IO Format:%I64d & %I64u SubmitStatusPracticeCodeForces 55D Description Volodya is an odd boy and...

diaocuiguo2493的博客 100

Beautiful numbers CodeForces - 55D (数位dp)

Beautiful numbers CodeForces - 55D 题意:给出t个样例,每样例给出L和R问在L和R中间有多少数为漂亮数,漂亮数的定义为:数里面的每一位都可以被该数整除。 思路:数位dp,首先将数分解为位数,然后进行dfs搜索。对于dfs里面每一位参数以作解释了。对于dp,2520是1-9的最小公倍数。50是1-2520里面有多少是2520的因数。 #include&l...

DeathYmz的博客 490

Codeforces 55D Beautiful numbers 数位dp 数论 优化技巧

数位dp 数论题 讲到了优化的技巧和原理

ned_chu的博客 688

CodeForces - 55D Beautiful numbers(数位DP+Hash)题解

题意:美丽数定义:一个正数能被所有位数整除。求给出一个范围,回答这个范围内的美丽数。思路:一个数能被所有位数整除,换句话说就是一个数能整除所有位数的LCM,所以问题就转化为一个数能否被所有位数的LCM整除。按照一般的思想,直接开三维dp[pos][num][lcm]。但是num范围很大,直接开就爆了,怎么办呢?我们可以把num%2520(即1~9的LCM)储存为mod,因为所有位数最大的LCM就是...

努力,奋斗 154

Codeforces 55D Beautiful numbers【数位dp】

D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Volodya is an odd boy and his taste is

世界很大 625

Codeforces 55D - Beautiful numbers 数位dp

55D - Beautiful numbers 把lcm离散化一下就能过了。 #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define ...

243

Codeforces 55D. Beautiful numbers 数位DP 离散化

题意:定义一个数为beautiful number,则这个数可以被其每位数整除,给出左右边界l和r,求出边界内存在的beautiful number个数 思路:数据量太大(9*10^18),故先要离散化,之后用数位DP对每位进行枚举,求出当前数位漂亮数字个数,递归求出答案。lcm表示a,b的最小公倍数,用来求各位数的最小公倍数,len表示枚举边界,即数位长度,lim表示是否最高位,用来求枚举上界 ...

qq_42397248的博客 217

CodeForces - 55D Beautiful numbers(数位DP)

题目链接:CodeForces - 55D Beautiful numbers Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer number is beautiful if and only if it is divisible by each of i...

Plus Ultra! 253
上一篇: POJ 2486 Apple Tree(树形dp)
下一篇: hdu 1069 Monkey and Banana(基础dp)
yphacker
博客等级 码龄12年 199粉丝 540原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值