CF55D 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 its nonzero digits. We will not argue with this and just count the quantity of beautiful numbers in given ranges.
Volodya是个奇怪的男孩,他的品味也很奇怪。 在他看来,当且仅当正整数可以被其每个非零数字整除时,它才是Beautiful的。 我们不会对此争论,而只计算给定范围内的 Beautiful number的数量。
输入格式
The first line of the input contains the number of cases $ t (1 \le t \le 10)$. Each of the next t lines contains two natural numbers \(l_i\) and \(r_i (1 \le li \le ri \le 9 \times 10^{18})\).
Please, do not use %lld specificator to read or write 64-bit integers in C++. It is preffered to use cin (also you may use %I64d).
输入的第一行包含数据组数\(t(1 \le t \le 10)\), 接下来的t行中的每行包含两个自然数$l_i \(和\)r_i(1 \le l_i \le r_i \le 9 \times 10 ^ {18})$.
请不要使用%lld在C ++中读取或写入64位整数。 建议使用cin(也可以使用%l64d).
输出格式
Output should contain tt numbers — answers to the queries, one number per line — quantities of beautiful numbers in given intervals (from \(l_{i}\) to \(r_i\), inclusively).
t行,每行输出从\(l_{i}\) 到 \(r_i\)的Beautiful number的数量
题解
这道题是数位DP我好像没学过啊,而且还是黑题...最开始真是一点思路都没有,后来看了dalao们的题解才能写出来.
这道题让求一段范围内的,比较容易想到的就是差分,求出\(1\)到\(r\)的数量,再求出\(1\)到\(l-1\)的数量,相减即可.
注意每位数都是\(1-9\),他们的最小公倍数是\(2520\),所以如果一个数可以整除\(2520\),就一定可以整除\(1-9\).
设\(dp[i][j][k]\),\(i\)表示还剩下多少位数要规划,这前\(i\)位数模\(2520\)的余数是\(j\),这前\(i\)位数的最小公倍数是\(k\).
如果最后的数能整除\(k\),那么它一定能整除它各位数字的最小公倍数
有可能出现的\(k\)都是\(2520\)的因数,所以将\(j\)取模\(2520\),若所得的结果整除\(k\),那么原来的数也一定整除\(k\).
所以就可以得到状态转移方程
\(dp[i][j][k]= \Sigma_{x=1}^{x_{max}} \ \ \ \ dp[i−1][(j \times 10+x) \% 2520][lcm(k,x)]\)
\(lcm(a,b)\)表示\(a\)和\(b\)的最小公倍数
但是如果开这么大的数组,会MLE,所以需要继续优化,注意第三维是\(lcm(k,x)\),是从\(1-9\)之间取数字做\(lcm\)运算,得到的结果数量远远少于\(2520\),所以与处理一下做一个离散化即可.
希望有一天能自己独立写出黑题.
代码
#include <bits/stdc++.h>
using namespace std;
int number[20], mp[2521], cnt;
long long dp[20][2521][50],l, r, t;
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
long long dfs(int length, int pre, int mod, bool limit ,long long ans = 0) {
if (!length) return pre % mod == 0;
if (!limit && dp[length][pre][mp[mod]] != -1) return dp[length][pre][mp[mod]];
int ed = limit ? number[length] : 9;
for (int i = 0; i <= ed; i++)
ans += dfs(length - 1, (pre * 10 + i) % 2520, i == 0 ? mod : mod * i / gcd(mod, i), limit && i == ed);
if (!limit) dp[length][pre][mp[mod]] = ans;
return ans;
}
long long solve(long long n, int length = 0) {
while (n) number[++length] = n % 10, n /= 10;
return dfs(length, 0, 1, 1);
}
int main() {
memset(dp, -1, sizeof(dp));
for (int i = 1; i <= 2520; i++)
if (!(2520 % i)) mp[i] = ++cnt;
cin >> t;
while (t--) {
cin >> l >> r;
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
题目链接 题意 定义一个数字\(x\)是\(beautiful\ number\)当且仅当\(x\)可以被其十进制表示下所有非\(0\)位置的数整除. 例如\(24\)是一个\(beautiful\ ...
- CF55D Beautiful numbers (数位dp)
题目链接 题解 一个数能被一些数整除,那么一定被这些数的\(lcm\)整除 那么我们容易想到根据\(lcm\)设状态 我们可以发现有用的\(lcm\)只有\(48\)个 那么按照一般的数位\(dp\) ...
- CF1265B Beautiful Numbers 题解
Content 给定一个 \(1\sim n\) 的排列,请求出对于 \(1\leqslant m\leqslant n\),是否存在一个区间满足这个区间是一个 \(1\sim m\) 的排列. 数据 ...
- cf55D. Beautiful numbers(数位dp)
题意 题目链接 Sol 看到这种题就不难想到是数位dp了. 一个很显然的性质是一个数若能整除所有位数上的数,则一定能整除他们的lcm. 根据这个条件我们不难看出我们只需要记录每个数对所有数的lcm(也 ...
- 【数位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(动态规划) 题面 洛谷 CF 题解 数位\(dp\) 如果当前数能够被它所有数位整除,意味着它能够被所有数位的\(lcm\)整除. 所以\(dp\)的 ...
- 【CF55D】Beautiful numbers
[CF55D]Beautiful numbers 题面 洛谷 题解 考虑到如果一个数整除所有数那么可以整除他们的\(lcm\),而如果数\(x\)满足\(x\bmod Lcm(1,2...,9)=r\ ...
随机推荐
- CentOS 6.X 双网卡绑定配置
相关环境 主机:Dell PowerEdge R720服务器(背板有4个GE网口) 操作系统:CentOS(RHEL)6.X 网线连接 使用6类网线 将Dell R720 GE网口 0,与交换机A相连 ...
- ubuntu安装ssh服务器
1.安装 sudo apt-get install openssh-server 2.配置文件路径 / etc/ssh/sshd_config 3.操作 sudo /etc/init.d/ssh st ...
- netty实现消息中心(二)基于netty搭建一个聊天室
前言 上篇博文(netty实现消息中心(一)思路整理 )大概说了下netty websocket消息中心的设计思路,这篇文章主要说说简化版的netty聊天室代码实现,支持群聊和点对点聊天. 此demo ...
- @gym - 100958J@ Hyperrectangle
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个大小为 \(l_1\times l_2 \dots l_ ...
- Keiichi Tsuchiya the Drift King (c++三角函数公式)【几何+三角函数公式】
Keiichi Tsuchiya the Drift King 感谢: https://blog.csdn.net/xiao_you_you/article/details/89357815 题目链 ...
- 在Xcode11上开发“面向低于iOS13版本的App”时的一些注意点
相关知识: https://blog.csdn.net/BUG_delete/article/details/103699563 'AppDelegate' is only available in ...
- spark源码解析总结
========== Spark 通信架构 ========== 1.spark 一开始使用 akka 作为网络通信框架,spark 2.X 版本以后完全抛弃 akka,而使用 netty 作为新的网 ...
- CAS(乐观锁)与ABA问题
cas是什么 CAS 全称 compare and swap 或者compare and exchange 比较并且交换.用于在没有锁的情况下,多个线程对同一个值的更新. cas原理 例如,我们对一 ...
- 049.Kubernetes集群管理-集群监控Metrics
一 集群监控 1.1 Metrics Kubernetes的早期版本依靠Heapster来实现完整的性能数据采集和监控功能,Kubernetes从1.8版本开始,性能数据开始以Metrics API的 ...
- EPLAN文本输入怎么转行,路径功能文本换行方法
EPLAN文本输入怎么转行,路径功能文本换行方法 在输入文本时,按CTRL+ENTER可以将字体换行 Ctrl+回车键