CF55D-Beautiful numbers (数位dp)

文章讨论了一种数学和编程问题,涉及lcm(最小公倍数)在判断一个数是否能被其所有非零位数字整除时的作用。通过动态规划和离散化技术,将原问题的空间复杂度降低,解决了内存溢出的问题。重点在于利用数的模2520的余数和数字的最小公倍数之间的关系进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
l c m ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ) = 2520 lcm(1,2,3,4,5,6,7,8,9)=2520 lcm(1,2,3,4,5,6,7,8,9)=2520

  • x x x 能被它自己的所有非零位的数字整除,即能被它们的最小公倍数整除, x ≡ 0 ( m o d   l c m ( { d i g i t [ i ] } ) ) x \equiv 0(mod\ lcm(\{digit[i]\})) x0(mod lcm({digit[i]}));
  • 2520 ≡ 0 ( m o d   l c m ( { d i g i t [ i ] } ) ) 2520 \equiv 0(mod\ lcm(\{digit[i]\})) 25200(mod lcm({digit[i]}))
  • x ≡ 0 ( m o d   l c m ( { d i g i t [ i ] } ) ) x \equiv 0(mod\ lcm(\{digit[i]\})) x0(mod lcm({digit[i]})),则 ( x   m o d   2520 ) ≡ 0 ( m o d   l c m ( { d i g i t [ i ] } ) ) (x\ mod\ 2520) \equiv 0(mod\ lcm(\{digit[i]\})) (x mod 2520)0(mod lcm({digit[i]}))

由以上可得,判断 x x x 只需判断 x   m o d   2520 x\ mod\ 2520 x mod 2520

  • dp[i][j][k] 表示前 i i i 位所表示的数模 2520 2520 2520 的余数为 j j j,这 i i i 位中非零数字的最小公倍数为 k k k,这样需要的空间为 d p [ 20 ] [ 2525 ] [ 2525 ] dp[20][2525][2525] dp[20][2525][2525],明显 M L E MLE MLE
  • 考虑到 2520 2520 2520 的约数共 48 48 48 个,所以,可以将最小公倍数离散化,将 k k k 换为最小公倍数在 2520 2520 2520 所有约数中的编号,最后一维通过离散化降到 50 50 50,从而空间为 d p [ 20 ] [ 2525 ] [ 50 ] dp[20][2525][50] dp[20][2525][50]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值