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\ ...
随机推荐
- 为什么我觉得 Java 的 IO 很复杂?
初学者觉得复杂是很正常的,归根结底是因为没有理解JavaIO框架的设计思想: 可以沿着这条路想一想: 1,学IO流之前,我们写的程序,都是在内存里自己跟自己玩.比如,你声明个变量,创建个数组,创建个集 ...
- 逐点分析,这样做Web端性能测试
前言: 71%用户希望在手机上打开网页能跟电脑一样快: 5秒钟被认为是用户能忍受的最长响应时间,如果响应时间超过5秒,50%的移动用户会放弃: 33%失望的用户会使用竞品替代: 用户尝试三次出现同样性 ...
- 大顶堆与小顶堆应用---寻找前k小数
vector<int> getLeastNumber(vector<int>& arr,int k){ vector<int> vec(k,); if(== ...
- WebService之Spring+CXF整合示例
一.Spring+CXF整合示例 WebService是一种跨编程语言.跨操作系统平台的远程调用技术,它是指一个应用程序向外界暴露一个能通过Web调用的API接口,我们把调用这个WebService的 ...
- CSAPP 5 - 优化程序性能
CSAPP 5 - 优化程序性能 1. 概述 首当其冲的,还是要编写出好的算法和数据结构,优化内部结构 其次才是编写出能让编译器 易优化的,高效的可执行代码.这点在特定的机器上可能有着特定的不同的优化 ...
- JNI_day02
二级指针 指向指针变量的指针,保存指针的地址 结构体 struct Student //struct Stdent 学生结构体类型 { int id;//成员 char name[20]; int a ...
- Linux中tomcat的部署
红帽7如何配置tomcat 1.下载tomcat9.0和java-1.8 tomcat的下载地址: https://tomcat.apache.org/ java1.8是radhat7自带: [roo ...
- PAT 1043 Is It a Binary Search Tree (25分) 由前序遍历得到二叉搜索树的后序遍历
题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...
- jmeter录制app测试脚本
1.jmeter 下载地址 https://jmeter.apache.org 2.选择下载包 3.下载完成后解压即可使用(也可以配置环境变量,但我一般不配置,可以使用) 4.打开jmeter 创建线 ...
- 使用LaTeX输入矩阵
当前各种文本编辑器支持的LaTeX数学公式库大多基于KaTeX,或者在Web中用MathJax的比较多,下面给出一种在Web中输入矩阵的例子 $$\left[ \begin{array}{cccc}a ...