#include <bits/stdc++.h> using namespace std; typedef long long ll; int already[10]; int forbidden[10]; const int nax = 20; ll C[nax][nax]; ll suf(int len, bool started) { vector<ll> ways(len + 1, 0); ways[0] = 1; if(!len && !started) return 0; for(int digit = 0; digit < 10; ++digit) for(int so_far = len; so_far >= 0; --so_far) { ll memo = ways[so_far]; ways[so_far] = 0; for(int cnt = 0; so_far + cnt <= len; ++cnt) for(int cnt_pref = 0; cnt_pref <= cnt; ++cnt_pref) { if((started || digit) && already[digit] + cnt == forbidden[digit]) continue; if(!started && !digit && already[digit] + cnt - cnt_pref == forbidden[digit]) continue; if(len - so_far == cnt_pref) ways[so_far + cnt] += memo; else if(len - so_far - cnt_pref - 1 >= 0) ways[so_far + cnt] += memo * C[len-so_far-cnt_pref-1][cnt-cnt_pref]; } } return ways[len]; } ll solve(ll up_to) { for(int i = 0; i < 10; ++i) already[i] = 0; vector<int> digits; while(up_to > 0) { digits.push_back(up_to % 10); up_to /= 10; } reverse(digits.begin(), digits.end()); ll total = 0; for(int where = 0; where < (int) digits.size(); ++where) { for(int i = 0; i < digits[where] + (where == (int) digits.size() - 1); ++i) { if(where || i) ++already[i]; total += suf((int) digits.size() - where - 1, where || i); if(where || i) --already[i]; } ++already[digits[where]]; } return total; } void test_case() { ll low, high; cin >> low >> high; for(int i = 0; i < 10; ++i) cin >> forbidden[i]; cout << solve(high) - solve(low - 1) << "\n"; } int main() { for(int i = 0; i < nax; ++i) { C[i][0] = C[i][i] = 1; for(int j = 1; j < i; ++j) C[i][j] = C[i-1][j] + C[i-1][j-1]; } int T; cin >> T; while(T--) test_case(); }