[CF55D]Beautiful numbers
Description
求满足以下条件的正整数 \(x\) 个数:
- \(l\le x \le r\)
 - \(x\) 的每一个非 \(0\) 数位都能整除 \(x\)。
 
\(1 \le l,r\le9\times10^{18}\)
Solution
思路比较顺的数位 \(\rm DP\)。由于 \(x\) 的每个非 \(0\) 数位均能整除 \(x\),所以 \(x\) 的非 \(0\) 数位的最小公倍数一定也能整除 \(x\)。令 \(f_{p,y,t}\) 表示当前枚举到第 \(p\) 位,所有数的最小公倍数为 \(y\),前 \(x\) 位组成的数字为 \(t\) 的方案数。这样时间复杂度显然爆炸,考虑缩小 \(y,t\) 的范围。
容易发现,\(y\) 必定是 \(2520=2^3\times 3^2 \times 5 \times 7=\mathrm{lcm}(2,3,4,\dots,9)\) 的因子。这样的 \(y\) 仅有 \(48\) 个。并且,\(2520\operatorname{|}t\) 是 \(y \operatorname{|} t\) 的必要条件。易证 \((t\bmod 2520)\bmod y=t \bmod y\),所以我们改 \(t\) 的意义为前 \(x\) 位组成的数字模 \(2520\) 的结果。
时间复杂度 \(\mathcal O(T\left(\log_{10}r\right)mc)\),\(m=2520\),\(c\) 表示 \(2520\) 的因数个数,等于 \(48\)。

                
            
        
浙公网安备 33010602011771号