题意: 给定区间, 求该区间内每个数的数字和
>> face <<
Strategy: 别忘了取模
状态: 目前搜到第i位该数的和为j
目标: $$
边界: 本题无
合法判断: 条件转移合法判断
attention: 取模
双倍经验: 开longlong
@author: jasonleft 记忆化数位
#include <bits/stdc++.h>
#include <bits/extc++.h>
#define _rep(i, a, b) for (ll i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (ll i = (a); i >= (b); --i)
#define _for(i, a, b) for (ll i = (a); i < (b); ++i)
#define _rof(i, a, b) for (ll i = (a); i > (b); --i)
#define ll long long
#define db double
#define oo 0x3f3f3f3f
#define eps 0.00001
#define all(x) x.begin(), x.end()
#define met(a, b) memset(a, b, sizeof(a))
#define id(x) ((x + 8))
#define bin(x) cerr << #x << " is " << bitset<15>(x) << endl
#define what_is(x) cerr << #x << " is " << x << endl
#define lowbit(x) x &(-x)
using namespace std;
const ll maxn = 30;
const int mod = 1e9 + 7;
ll dp[maxn][300], l, r, cnt, a[maxn];
ll dfs(int cur, int sum, bool up)
{
if (!cur)
return sum;
ll &t = dp[cur][sum];
if (!up && ~t)
return t;
ll ret = 0;
_rep(i, 0, up ? a[cur] : 9)
{
ret += dfs(cur - 1, sum + i, up && i == a[cur]), ret %= mod;
}
if (!up)
t = ret;
return ret;
}
ll ask(ll __)
{
cnt = 0;
met(a, 0);
for (; __; __ /= 10)
a[++cnt] = __ % 10;
return dfs(cnt, 0, 1);
}
signed main()
{
ios::sync_with_stdio(0);
int t;
cin >> t;
met(dp, -1);
while (t--)
{
cin >> l >> r;
cout <<( ask(r) - ask(l - 1) + mod ) % mod << endl;
}
}
来源:https://blog.csdn.net/weixin_43533544/article/details/98985501