#include #include #include #include #include #include #include #include #include using namespace std; //変数デバッグ #define DEB(variable) cout << #variable << '=' << variable << endl //for簡易表記(引数ミス防止) #define FOR(LoopVariable,numberOFbegin,numberOFend) for (int LoopVariable = (numberOFbegin); (LoopVariable) < (numberOFend); (LoopVariable)++) #define DEFOR(LoopVariable,numberOFbegin,numberOFend) for (int LoopVariable = (numberOFbegin)-1; (LoopVariable) >= (numberOFend); (LoopVariable)--) #define REP(LoopVariable,numberOFend) for(int LoopVariable = 0;(LoopVariable)<(numberOFend);LoopVariable++) constexpr long long int linf = numeric_limits::max()-5; constexpr int inf= numeric_limits::max()-5; constexpr long long int mod = 1000000007; int main(){ string s, t; cin >> s >> t; const int sn = (int)s.size(), tn = (int)t.size(); int tmp = sn - 1; while(s[tmp]=='0'){ s[tmp] = '9'; tmp--; } s[tmp]--; vector>>>> dp1(10001,vector>>>(2,vector>>(2,vector>(3,vector(8,0))))),dp2(10001,vector>>>(2,vector>>(2,vector>(3,vector(8,0))))); dp1[0][0][0][0][0] = 1; dp2[0][0][0][0][0] = 1; int x; REP(i,tn){ REP(j,2){ REP(k,2){ REP(l,3){ REP(m,8){ x = j ? 9 : (int)(t[i] - '0'); REP(n,x+1){ dp1[i + 1][j || n < x][k || n == 3][(l + n) % 3][(m * 10 + n) % 8] += dp1[i][j][k][l][m]; } } } } } } REP(i,sn){ REP(j,2){ REP(k,2){ REP(l,3){ REP(m,8){ x = j ? 9 : (int)(s[i] - '0'); REP(n,x+1){ dp2[i + 1][j || n < x][k || n == 3][(l + n) % 3][(m * 10 + n) % 8] += dp2[i][j][k][l][m]; } } } } } } long long int result = 0; REP(i,2){ REP(j,2){ REP(k,3){ REP(l,8){ if((j||k==0)&&l!=0){ result += dp1[tn][i][j][k][l]-dp2[sn][i][j][k][l]; result %= mod; } } } } } cout << result << endl; return 0; }