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\ ...
随机推荐
- PAT 反转链表
给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4,则输出应该 ...
- Mybatis多表操作
一:引言 在学习完前面的mybatis基本语法后,大家都有个认知,这个Mybatis太强大了,比之前使用JDBC写方便多了,但是你们当初在使用原生JDBC写SQL查询的时候有没有遇到过多表查询呢?肯定 ...
- lambda表达式操作DataTable
using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text; ...
- iOS — 内存分配与分区
1 RAM ROM RAM:运行内存,不能掉电存储.ROM:存储性内存,可以掉电存储,例如内存卡.Flash. 由于RAM类型不具备掉电存储能力(即一掉电数据消失),所以app程序一般存放 ...
- 诸葛亮vs司马懿,排序算法大战谁能笑到最后?
阵前对峙 公元234年,蜀汉丞相诸葛孔明再次北伐. 一日,与司马仲达所率魏军两军相峙,二人阵前舌战. 司马曰:"诸葛村夫,吾与汝相斗数年,斗兵斗阵斗谋略,均已疲乏.今日,何不一改陈规,斗点新 ...
- yii2中的场景使用
下面给大家介绍一下 yii2.0 场景的使用.小伙多唠叨一下了,就是担心有的人还不知道,举个简单的例子,现在在 post表里面有 title image content 三个的字段,当我创建一个 po ...
- Github上可以涨薪30k的Java教程和实战项目终于可以免费下载了
写在前面 大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架.软件或者教程.这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整 ...
- git clone 时注意点
环境: 在公司访问外网需要设置代理,另外,在公司局域网内架设了一台 GIT 服务器. 在使用 git clone 时,不能设置成 git 使用代理: git config --global http. ...
- 如何安装vim自动补全插件YouCompleteMe(YCM)
Vim是全平台上一个高度可拓展的编辑器.它本身只是一个简陋的编辑器,但是因为有各种插件而变得强大.使用Vim编写代码就不免遇到代码补全的问题.常用的代码补全插件有两个:日本人shougo写的neoco ...
- Activity学习笔记1
Activity概述 简单的理解Activity就是指Android手机或平板的一个屏,类似Window的一个窗口,浏览器的一个页面. Activity的4种状态 Activity的生命周期 创建Ac ...