Pre
前前后后交了 \(4\) 次。
Solution
直接枚举模数,就是每一个数的各位数的和,然后 \(dp\) 到了最后判断和是否相等。
学习了记忆化搜索实现的数位 \(dp\) ,发现挺好用的。
Code
#include <cstdio> #include <cstring> #define ll long long using namespace std; const ll N = 20, M = 200; ll dp[N][M][M], a[N], len, mod; inline ll dfs (int p, int limit, int st, int pre) { if (!p) { if (st == mod && !pre) return 1; else return 0; } if (!limit && dp[p][st][pre] != -1) return dp[p][st][pre]; ll res = 0; for (int i = 0; i <= (limit ? a[p] : 9); ++i) { res += dfs (p - 1, limit && (i == a[p]), st + i, (pre * 10 + i) % mod); } if (!limit) dp[p][st][pre] = res; return res; } inline ll solve (ll lhjakioi) { if (!lhjakioi) return 0; len = 0; while (lhjakioi) { a[++len] = lhjakioi % 10; lhjakioi /= 10; } ll ans = 0; for (mod = 1; mod <= 162; ++mod) { memset (dp, -1, sizeof (dp)); ans += dfs (len, 1, 0, 0); } return ans; } signed main () { #ifdef chitongz freopen ("x.in", "r", stdin); #endif ll a, b; scanf ("%lld%lld", &a, &b); printf ("%lld\n", solve (b) - solve (a - 1)); return 0; }
Conclusion
作为记忆化搜索实现数位 \(dp\) 的第一题, \(WA\) 了三次。
第一次,第二次是 \(dp\) 的状态设计错误,没有记录当前的数模枚举的 \(mod\) 的值。
第三次是没有 \(dfs\) 函数没有返回 \(long\ long\)