CF55D Beautiful Numbers

打出暴搜后有些茫然,不知道该怎么优化才好,看了题解才豁然开朗。

简单说下暴搜的思路:参数有\(pos,limit,lcm,num\)。其中\(lcm\)表示到\(pos+1\)位,所有非\(0\)位的\(lcm\)是多少;\(num\)表示填到\(pos+1\)位的整个数是多少。然后在\(pos=0\)时判断\(lcm\)是否整除\(num\),是则返回\(1\),否则返回\(0\),然后一层层累加。

优化思路其实很简单:

显然直接用\(f[pos][num][lcm]\)来记忆化,无论时间还是空间都是过不去的。

但我们知道所有非\(0\)位整除\(num\),就等价于它们的\(lcm\)整除\(num\)。

我们想知道\(num\)是否被\(2\)整除,那么我们关注它\(mod\ 2\)的值是否为\(0\);

我们想知道\(num\)是否被\(6\)整除,那么我们关注它\(mod\ 6\)的值是否为\(0\)。

……

那么我们想知道\(num\)是否被\(a_1,a_2,…,a_k\)整除,那么我们只需要关注它\(mod\ lcm\{a_1,a_2,…,a_k\}\)的值是否为\(0\)。

那么我们只需要记录\(num\ mod\ lcm\{1,2,…,9\}\)的值即\(num\ mod\ 2520\)即可。

\(f[pos][num][lcm]\)空间共\(20*2520*2520\)。而250MB的空间限制还是不允许我们开那么大。怎么继续优化呢?


注意到\(lcm\)中我们能用到的一共就那么几个。我们知道\(2520\)一共有\(48\)个因数。而我们\(1\sim 9\)能凑出的数的个数肯定比\(48\)少了。因此我们把质因数离散化一下,第三维开\(50\)绰绰有余。

我的代码和离散化的意思差不多,大概是现读现存的感觉,用map存下来每个质因数存在哪个位置上。

update on 2024/11/28:比起使用map之类,还是更建议提前预处理,否则常数较大,容易被卡。

(不知道为什么用了unsigned long long,其实不需要)

点击查看代码
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int t,l,r,a[30],f[30][2520][50];
bool vis[30][2520][50];
map<int,int> ma;
int val[50],cnt;
int __lcm(int a,int b){
return a/__gcd(a,b)*b;
}
int dfs(int pos,bool limit,int lcm,int num){
if(pos==0){
if(num%lcm==0) return 1;
return 0;
}
if(!limit&&ma.find(lcm)!=ma.end()&&vis[pos][num][ma[lcm]]) return f[pos][num][ma[lcm]];
int rig=limit?a[pos]:9,ans=0;
for(int i=0;i<=rig;i++){
ans+=dfs(pos-1,limit&&i==rig,i?__lcm(lcm,i):lcm,(num*10+i)%2520);
}
if(!limit){
if(ma.find(lcm)==ma.end()) ma[lcm]=++cnt,val[cnt]=lcm;
f[pos][num][ma[lcm]]=ans,vis[pos][num][ma[lcm]]=1;
}
return ans;
}
int solve(int x){
int len=0;
while(x){
a[++len]=x%10;
x/=10;
}
return dfs(len,1,1,0);
}
signed main(){
cin>>t;
memset(vis,0,sizeof vis);
while(t--){
cin>>l>>r;
cout<<solve(r)-solve(l-1)<<endl;
}
return 0;
}

[题解]CF55D Beautiful Numbers的更多相关文章

  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 题解

    题目 Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer n ...

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

  4. CF55D Beautiful numbers

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

  5. CF55D Beautiful numbers (数位dp)

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

  6. cf55D. Beautiful numbers(数位dp)

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

  7. 【数位DP】CF55D Beautiful numbers

    $dp[x][p][pp]$表示第x位,当前已有数字mod 2520(1~9数字的lcm)为p,当前各位数字的lcm为pp 观察到数组太大,考虑压缩,第三维lcm最多只有9个数字,打表发现最多只有48 ...

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

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

  9. 【CF55D】Beautiful numbers

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

  10. [codeforces 55]D. Beautiful numbers

    [codeforces 55]D. Beautiful numbers 试题描述 Volodya is an odd boy and his taste is strange as well. It ...

随机推荐

  1. 如何实现本地大模型与MCP集成

    1.概述 本文将围绕构建兼具本地运行大型语言模型(LLM)与MCP 集成能力的 AI 驱动工具展开,为读者提供从原理到实践的全流程指南.通过深度整合本地大模型的隐私性.可控性优势与 MCP 工具的自动 ...

  2. J积分

    J积分是断裂力学中表征裂纹尖端能量场的路径无关积分,具有两个核心功能: 积分路径为从裂纹下表面上任意一点出发,沿任一路径绕过裂纹尖端,最后终止于裂纹上表面的任意一点. J积分具有守恒性(与路径无关). ...

  3. 关于打高版本java,cc6复现

    关于打高版本java,cc6复现 从上一篇的cc1中我们发现他不能作用在jdk_8u71以上的版本,因此;为了解决这个问题,引入了cc6 之所以不能用cc1打高版本,是由于在Java 8u71以后, ...

  4. vue中使用axios获取到的Promise {<pending>}数据,无法使用的问题

    使用axios拿到后端数据后 返回的是 Promise {} 我们可以看到数据是在[[PromiseResult]]这个Object对象中 此时我们是无法获取对象的 解决方法:使用async和awai ...

  5. 深入剖析开源AI阅读器项目Saga Reader基于大模型的文本转换与富文本渲染优化方案

    引言 AI阅读器作为一种新型的内容消费工具,正在改变人们获取和处理信息的方式.本文将介绍Saga Reader项目中如何利用大型语言模型(LLM)进行网页内容抓取.智能优化和富文本渲染,特别是如何通过 ...

  6. 函数使用十五:BAPI_PO_RELEASE

    *&---------------------------------------------------------------------* *& Report ZBAPI_PO_ ...

  7. UFT 获取linux log

  8. go-zero使用

    官网文档地址: https://go-zero.dev/docs/tasks 这是一个脚手架,用于把proto文件或者api文件转为服务代码. 环境安装分4步(官网文档上有写): 1.安装golang ...

  9. SQL Prompt 联网限制

    SQLPrompt关闭联网_sqlprompt阻止联网_幻欢子的博客-CSDN博客 方法一:修改hosts文件 1.安装SQLPrompt_xxx.exe成功后,编辑修改hosts文件:C:\Wind ...

  10. Modbus网关ZLAN5443D 在锂电池干燥箱的应用

    在锂离子电池生产过程中,将正负极片辊压绕卷再放入电池盒之后,须对锂电池电芯极组进行烘烤干燥.相信大家也了解水分对锂电池的性能影响是很大的,需要注液前在装配车间将锂离子电池电芯内部的水分去除,以免影响锂 ...