题意:问你[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)>=