ACwing 311. 月之谜 数位dp

博客介绍了如何使用数位DP解决一类询问[l,r]内数字被其数位和整除的问题。通过设立状态dp[pos][sum][add]表示枚举到数位pos,逐步取模结果为sum,数位和为add的方案数,最终转化成对每个可能的整除数m进行枚举,找出符合条件的数字个数。" 112531384,10575652,CobaltStrike渗透测试实战指南,"['渗透测试', '信息安全']
摘要由CSDN通过智能技术生成

题意:问你[l,r]内有多少数,是可以被其数位和整除的。

思路:

思路:直观想法,用 d p [ p o s ] [ s u m 1 ] [ s u m 2 ] dp[pos][sum1][sum2] dp[pos][sum1][sum2],表示枚举到第pos位,组成sum1的数,累加和为sum2时的方案数。由于sum1很大,所以要考虑每步取模。


想到,若给定一个m,问你有多少数是被m整除,这个就是一个裸的数位dp板子,用一个 d p [ p o s ] [ s u m ] dp[pos][sum] dp[pos][sum]就可以表示枚举到第pos位,逐步取模结果为sum时的方案数。计数就是最后sum==0时为一个可行方案。


那么回到这个题,由于这个可能的m很小,不超过100,所以我们完全可以枚举m,让本题转化为上述问题。所以我们用 d p [ p o s ] [ s u m ] [ a d d ] dp[pos][sum][add] dp[pos][sum][add],表示当前枚举到pos位,逐步取模结果为sum,且数位和为add时的方案数。最后计数可行方案的情况为sum为0且add等于当前枚举的m。

AC代码:

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值