55 D. Beautiful numbers

题意:
一个整数是beautiful的当且仅当它的所有非零数位都可以整除它,求区间范围内beautiful数个数.
题解:
([l,r])可以转化为([0,r])的答案减去([0,l))的答案.
使用数位dp,状态为(dp[i][j][p][q])表示枚举到第(i)位,前缀是否不同((j)),出现的非零数位最小公倍(p),前缀模(2520)的余数((q)).
由于(p)的取值只有(d(2520)=48)种,因此复杂度约为(2cdot19cdot2cdot48cdot2520cdot10cdot10=919296000approx9 imes10^8),由于常数较小可以通过.
代码
优化:
注意到模(8)的余数仅由最后(3)位决定,模(5)的余数仅由最后一位决定,可以优化每一位的模数范围,具体地:前面为(63),最后三位分别为(126),(252),(2520).
复杂度变为(2cdot2cdot48cdot(16 * 63 + 126 + 252 + 2520)cdot10cdot10=74995200approx7 imes10^7).
代码

原文地址:https://www.cnblogs.com/Heltion/p/13404729.html