#include "bits/stdc++.h"
#define ll long long
#define pb push_back
using namespace std;
const ll mod = 1e9 + 7 ;
ll num[ 100006 ] [ 10 ] [ 2 ] , dp[ 100006 ] [ 10 ] [ 2 ] ; // dp[index][digit][equal_or_not] - the sum of f(x) up to index, such that the last digit is digit and it is still equal to the initial number iff equal_or_not == 1
ll p[ 100006 ] ;
ll t;
void add( ll & x, ll val)
{
x + = val;
if ( x >= mod)
x - = mod;
}
pair< ll, ll> f( vector< ll> vec) // pair<sum of all f less than x,sum of all f less than or equal to x>
{
for ( ll idx = 0 ; idx <= vec.size ( ) ; idx++ )
{
for ( ll digit = 0 ; digit < 10 ; digit++ )
{
for ( ll equal = 0 ; equal < 2 ; equal++ )
{
dp[ idx] [ digit] [ equal] = num[ idx] [ digit] [ equal] = 0 ;
}
}
}
num[ 0 ] [ 0 ] [ 1 ] = 1 ;
for ( ll idx = 0 ; idx < vec.size ( ) ; idx++ )
{
for ( ll digit = 0 ; digit < 10 ; digit++ )
{
for ( ll equal = 0 ; equal < 2 ; equal++ )
{
ll idx_next = idx + 1 ;
for ( ll next_digit = 0 ; next_digit < 10 ; next_digit++ )
{
if ( equal && ( next_digit > vec[ idx] ) )
break ;
ll equal_next = ( equal & ( next_digit == vec[ idx] ) ) ;
add( num[ idx_next] [ next_digit] [ equal_next] , num[ idx] [ digit] [ equal] ) ;
add( dp[ idx_next] [ next_digit] [ equal_next] , dp[ idx] [ digit] [ equal] ) ;
if ( next_digit ! = digit)
add( dp[ idx_next] [ next_digit] [ equal_next] , ( ( ( num[ idx] [ digit] [ equal] * p[ ( vec.size ( ) - 1 - idx) ] ) % mod) * next_digit) % mod) ;
// ^^ if the next digit is equal to the current one, we shouldn't change the sum, else we should add 10^idx * next_digit.
}
}
}
}
pair< ll, ll> ans = make_pair( 0 , 0 ) ;
for ( ll digit = 0 ; digit < 10 ; digit++ )
{
ans = make_pair( ( ans.first + dp[ vec.size ( ) ] [ digit] [ 0 ] ) % mod, ( ans.second + dp[ vec.size ( ) ] [ digit] [ 0 ] + dp[ vec.size ( ) ] [ digit] [ 1 ] ) % mod) ;
}
return ans;
}
int main( )
{
// Precomputing (10^i)%mod
p[ 0 ] = 1 ;
for ( ll i = 1 ; i <= 100005 ; i++ )
p[ i] = ( p[ i - 1 ] * 10 ) % mod;
cin >> t;
while ( t-- )
{
ll lnum, rnum;
string l, r;
vector< ll> vecl, vecr;
cin >> lnum >> l;
cin >> rnum >> r;
for ( auto it : l)
vecl.pb ( it - '0' ) ;
for ( auto it : r)
vecr.pb ( it - '0' ) ;
cout << ( mod + f( vecr) .second - f( vecl) .first ) % mod << endl;
}
return 0 ;
}
I2luY2x1ZGUgImJpdHMvc3RkYysrLmgiCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgcGIgcHVzaF9iYWNrCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBsbCBtb2QgPSAxZTkgKyA3OwoKbGwgbnVtWzEwMDAwNl1bMTBdWzJdLCBkcFsxMDAwMDZdWzEwXVsyXTsgLy8gZHBbaW5kZXhdW2RpZ2l0XVtlcXVhbF9vcl9ub3RdIC0gdGhlIHN1bSBvZiBmKHgpIHVwIHRvIGluZGV4LCBzdWNoIHRoYXQgdGhlIGxhc3QgZGlnaXQgaXMgZGlnaXQgYW5kIGl0IGlzIHN0aWxsIGVxdWFsIHRvIHRoZSBpbml0aWFsIG51bWJlciBpZmYgZXF1YWxfb3Jfbm90ID09IDEKbGwgcFsxMDAwMDZdOwpsbCB0OwoKdm9pZCBhZGQobGwgJngsIGxsIHZhbCkKewoJeCArPSB2YWw7CglpZiAoeCA+PSBtb2QpCgkJeCAtPSBtb2Q7Cn0KCnBhaXI8bGwsIGxsPiBmKHZlY3RvcjxsbD4gdmVjKSAvLyBwYWlyPHN1bSBvZiBhbGwgZiBsZXNzIHRoYW4geCxzdW0gb2YgYWxsIGYgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHg+CnsKCWZvciAobGwgaWR4ID0gMDsgaWR4IDw9IHZlYy5zaXplKCk7IGlkeCsrKQoJewoJCWZvciAobGwgZGlnaXQgPSAwOyBkaWdpdCA8IDEwOyBkaWdpdCsrKQoJCXsKCQkJZm9yIChsbCBlcXVhbCA9IDA7IGVxdWFsIDwgMjsgZXF1YWwrKykKCQkJewoJCQkJZHBbaWR4XVtkaWdpdF1bZXF1YWxdID0gbnVtW2lkeF1bZGlnaXRdW2VxdWFsXSA9IDA7CgkJCX0KCQl9Cgl9CgoJbnVtWzBdWzBdWzFdID0gMTsKCWZvciAobGwgaWR4ID0gMDsgaWR4IDwgdmVjLnNpemUoKTsgaWR4KyspCgl7CgkJZm9yIChsbCBkaWdpdCA9IDA7IGRpZ2l0IDwgMTA7IGRpZ2l0KyspCgkJewoJCQlmb3IgKGxsIGVxdWFsID0gMDsgZXF1YWwgPCAyOyBlcXVhbCsrKQoJCQl7CgkJCQlsbCBpZHhfbmV4dCA9IGlkeCArIDE7CgkJCQlmb3IgKGxsIG5leHRfZGlnaXQgPSAwOyBuZXh0X2RpZ2l0IDwgMTA7IG5leHRfZGlnaXQrKykKCQkJCXsKCQkJCQlpZiAoZXF1YWwgJiYgKG5leHRfZGlnaXQgPiB2ZWNbaWR4XSkpCgkJCQkJCWJyZWFrOwoJCQkJCWxsIGVxdWFsX25leHQgPSAoZXF1YWwgJiAobmV4dF9kaWdpdCA9PSB2ZWNbaWR4XSkpOwoJCQkJCWFkZChudW1baWR4X25leHRdW25leHRfZGlnaXRdW2VxdWFsX25leHRdLCBudW1baWR4XVtkaWdpdF1bZXF1YWxdKTsKCQkJCQlhZGQoZHBbaWR4X25leHRdW25leHRfZGlnaXRdW2VxdWFsX25leHRdLCBkcFtpZHhdW2RpZ2l0XVtlcXVhbF0pOwoJCQkJCWlmIChuZXh0X2RpZ2l0ICE9IGRpZ2l0KQoJCQkJCQlhZGQoZHBbaWR4X25leHRdW25leHRfZGlnaXRdW2VxdWFsX25leHRdLCAoKChudW1baWR4XVtkaWdpdF1bZXF1YWxdICogcFsodmVjLnNpemUoKSAtIDEgLSBpZHgpXSkgJSBtb2QpICogbmV4dF9kaWdpdCkgJSBtb2QpOwoJCQkJCS8vIF5eIGlmIHRoZSBuZXh0IGRpZ2l0IGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IG9uZSwgd2Ugc2hvdWxkbid0IGNoYW5nZSB0aGUgc3VtLCBlbHNlIHdlIHNob3VsZCBhZGQgMTBeaWR4ICogbmV4dF9kaWdpdC4KCQkJCX0KCQkJfQoJCX0KCX0KCXBhaXI8bGwsIGxsPiBhbnMgPSBtYWtlX3BhaXIoMCwgMCk7Cglmb3IgKGxsIGRpZ2l0ID0gMDsgZGlnaXQgPCAxMDsgZGlnaXQrKykKCXsKCQlhbnMgPSBtYWtlX3BhaXIoKGFucy5maXJzdCArIGRwW3ZlYy5zaXplKCldW2RpZ2l0XVswXSkgJSBtb2QsIChhbnMuc2Vjb25kICsgZHBbdmVjLnNpemUoKV1bZGlnaXRdWzBdICsgZHBbdmVjLnNpemUoKV1bZGlnaXRdWzFdKSAlIG1vZCk7Cgl9CglyZXR1cm4gYW5zOwp9CgppbnQgbWFpbigpCnsKCS8vIFByZWNvbXB1dGluZyAoMTBeaSklbW9kCglwWzBdID0gMTsKCWZvciAobGwgaSA9IDE7IGkgPD0gMTAwMDA1OyBpKyspCgkJcFtpXSA9IChwW2kgLSAxXSAqIDEwKSAlIG1vZDsKCgljaW4gPj4gdDsKCXdoaWxlICh0LS0pCgl7CgkJbGwgbG51bSwgcm51bTsKCgkJc3RyaW5nIGwsIHI7CgkJdmVjdG9yPGxsPiB2ZWNsLCB2ZWNyOwoKCQljaW4gPj4gbG51bSA+PiBsOwoJCWNpbiA+PiBybnVtID4+IHI7CgoJCWZvciAoYXV0byBpdCA6IGwpCgkJCXZlY2wucGIoaXQgLSAnMCcpOwoKCQlmb3IgKGF1dG8gaXQgOiByKQoJCQl2ZWNyLnBiKGl0IC0gJzAnKTsKCgkJY291dCA8PCAobW9kICsgZih2ZWNyKS5zZWNvbmQgLSBmKHZlY2wpLmZpcnN0KSAlIG1vZCA8PCBlbmRsOwoJfQoJcmV0dXJuIDA7Cn0=