状态:
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]目前搜到第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)usingnamespace std;const ll maxn =30;constint 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;returndfs(cnt,0,1);}signedmain(){
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;}}