CF55D】的更多相关文章

CF55D Beautiful numbers 题意 \(t(\le 10)\)次询问区间\([l,r](1\le l\le r\le 9\times 10^{18})\)中能被每一位上数整除的数的个数,0算可以整除任何数. 最开始写了个假做法,既没算0复杂度也是假的 最开始把每个模数都压进去了,后来发现只压2520就可以了 然后前两位压前\(i\)位与\(\bmod 2520\)的结果,第三位最开始压了每个数字出现集合,这样就很屑. 可以直接压数字集合的最小公倍数,仅有不到50个取值,做一个H…
[CF55D]Beautiful numbers(动态规划) 题面 洛谷 CF 题解 数位\(dp\) 如果当前数能够被它所有数位整除,意味着它能够被所有数位的\(lcm\)整除. 所以\(dp\)的时候前面所有数的\(lcm\)要压进\(dp\)值中. 又因为\(lcm\)的余数也是有意义的,但是又不能暴力记, 所以记录一下\([1,9]\)所有数的\(lcm\)也就是\(2520\)就好了. 但是数组太大,实际上,有意义的\(lcm\)个数只有不到\(50\)个,重新编号就可以压缩状态了.…
[CF55D]Beautiful numbers 题面 洛谷 题解 考虑到如果一个数整除所有数那么可以整除他们的\(lcm\),而如果数\(x\)满足\(x\bmod Lcm(1,2...,9)=r\),且\(r\bmod Lcm\{x有的数\}=0\),那么这个数一定满足条件. 因为\(Lcm(1,2...,9)=2520\)比较小,所以我们可以存下来. 考虑数位dp,我们设\(f[i][lcm][r]\)表示目前\(dp\)到第\(i\)位,当前已选的数的\(lcm\)为\(lcm\),前面…
题目链接 题意 定义一个数字\(x\)是\(beautiful\ number\)当且仅当\(x\)可以被其十进制表示下所有非\(0\)位置的数整除. 例如\(24\)是一个\(beautiful\ number\),因为他可以被\(2\)和\(4\)整除. 而\(28\)不是一个\(beautiful\ number\),因为他不能被\(8\)整除 给出两个数字\(L,R\; (1 \le L\le R \le 10^{18})\) 求出区间\([L,R]\)内有多少\(beautiful\…
/* 漂亮数定义:可以整除任意数位上的数 求出区间[l,r]之间的漂亮数个数 因为 dp[i][j][k]:i位前模lcm的值是j,i位前lcm是k的漂亮数个数 */ #include<bits/stdc++.h> using namespace std; #define ll long long ll dp[][][],has[],a[],len,tot; void init(){//2520最多也就51个约数 ;i<=;i++) %i==)has[i]=++tot; } ll LCM…
题意 题目链接 Sol 看到这种题就不难想到是数位dp了. 一个很显然的性质是一个数若能整除所有位数上的数,则一定能整除他们的lcm. 根据这个条件我们不难看出我们只需要记录每个数对所有数的lcm(也就是2520)取模的结果 那么\(f[i][j][k]\)表示还有\(i\)个数要决策,之前的数模\(2520\)为\(j\),之前的数的lcm为k的方案 第三维可以预处理 #include<bits/stdc++.h> #define Pair pair<int, int> #def…
传送门 一句话题意 求 l~r 之间有多少个数能整除自己各位上的数(排除 0 ) 分析 然后我们一看就知道数位 dp ,但是状态很难设计啊 QWQ 我们可以发现所有数位的 lcm 最大为 2520 (就是 1~ 9 的 lcm 嘛) 然后我们再看就能发现某个数模 2520 下如果能整除 它所有数位的 lcm 那么它就是满足条件的数 也就是说 一个数模其所有数位的 lcm 的结果 和 模 2520 后再去模这个 lcm 的结果 是相同的 为什么?什么为什么,因为一个数所有数位的 lcm 必然是 2…
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 num…
题面 数位DP+状压. 首先,按照数位DP的基本套路,每个个位数的最小公倍数为2520,所以只用考虑模2520的情况.考虑一个DP.dp[i][j][k]表示当前是第i位,2~9的数的集合为j,模2520为k的方案数.然后,就是数位DP的基本套路解决这道题. #include <bits/stdc++.h> using namespace std; typedef long long LL; inline LL read () { LL res = ; ) ; char ch = getcha…
题目链接 题解 一个数能被一些数整除,那么一定被这些数的\(lcm\)整除 那么我们容易想到根据\(lcm\)设状态 我们可以发现有用的\(lcm\)只有\(48\)个 那么按照一般的数位\(dp\) 设出状态:\(f_{i,j,k,0/1}\)表示前\(i\)位,\(lcm=j\),模\(lcm\)的余数是\(k\),是否达到上界 但是这样子是无法转移的(因为新添加一个数模数可能会产生变化) 那么我们把模数统一成\(2520\) 复杂度\(O(T*L*48*2500*2)\) 其中\(L\)是…