#include <iostream>
#include <vector>
using namespace std;
const int mod = 1000000007;
vector<vector<long long>> mat_mul(vector<vector<long long>>& arr, vector<vector<long long>>& brr){
vector<vector<long long>> result(arr.size(), vector<long long>(brr[0].size()));
for(int i = 0; i < arr.size(); i++){
for(int j = 0; j < brr[0].size(); j++){
for(int k = 0; k < arr[0].size(); k++){
result[i][j] += arr[i][k] * brr[k][j];
result[i][j] %= mod;
}
}
}
return result;
}
vector<vector<long long>> pow(vector<vector<long long>>& a, long long n){
if(n == 1){
return a;
}
auto result = pow(a, n / 2);
result = mat_mul(result, result);
if(n % 2 == 1){
result = mat_mul(result, a);
}
return result;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--){
long long n;
cin >> n;
if(n <= 2){
string str;
cin >> str;
int answer = 0;
int x = n == 1 ? 10 : 100;
for(int i = 0; i < x; i++){
bool check = true;
for(int j = 1; j <= 6; j++){
check &= (str[j - 1] == '0' and i % j != 0) or (str[j - 1] == '1' and i % j == 0) or (str[j - 1] == '2');
}
answer += check;
}
cout << answer << "\n";
}else{
vector<bool> check(60, true);
string str;
cin >> str;
for(int i = 1; i <= 6; i++){
if(str[i - 1] == '0'){
for(int j = 0; j < 60; j++){
if(j % i == 0){
check[j] = false;
}
}
}else if(str[i - 1] == '1'){
for(int j = 0; j < 60; j++){
if(j % i != 0){
check[j] = false;
}
}
}
}
int x1 = 0;
int x2 = 0;
for(int i = 0; i < 60; i++){
x1 += check[i];
}
for(int i = 0; i < 40; i++){
x2 += check[i];
}
vector<vector<long long>> mat = {{10, 6}, {0, 1}};
auto temp = pow(mat, n - 2);
cout << ((temp[0][0] + temp[0][1]) % mod * x1 % mod + x2) % mod << "\n";
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBtb2QgPSAxMDAwMDAwMDA3OwoKCnZlY3Rvcjx2ZWN0b3I8bG9uZyBsb25nPj4gbWF0X211bCh2ZWN0b3I8dmVjdG9yPGxvbmcgbG9uZz4+JiBhcnIsIHZlY3Rvcjx2ZWN0b3I8bG9uZyBsb25nPj4mIGJycil7CgkKCXZlY3Rvcjx2ZWN0b3I8bG9uZyBsb25nPj4gcmVzdWx0KGFyci5zaXplKCksIHZlY3Rvcjxsb25nIGxvbmc+KGJyclswXS5zaXplKCkpKTsKCQoJZm9yKGludCBpID0gMDsgaSA8IGFyci5zaXplKCk7IGkrKyl7CgkJZm9yKGludCBqID0gMDsgaiA8IGJyclswXS5zaXplKCk7IGorKyl7CgkJCWZvcihpbnQgayA9IDA7IGsgPCBhcnJbMF0uc2l6ZSgpOyBrKyspewoJCQkJcmVzdWx0W2ldW2pdICs9IGFycltpXVtrXSAqIGJycltrXVtqXTsKCQkJCXJlc3VsdFtpXVtqXSAlPSBtb2Q7CgkJCX0KCQl9Cgl9CgkKCXJldHVybiByZXN1bHQ7CgkKfQoKdmVjdG9yPHZlY3Rvcjxsb25nIGxvbmc+PiBwb3codmVjdG9yPHZlY3Rvcjxsb25nIGxvbmc+PiYgYSwgbG9uZyBsb25nIG4pewoJaWYobiA9PSAxKXsKCQlyZXR1cm4gYTsKCX0KCWF1dG8gcmVzdWx0ID0gcG93KGEsIG4gLyAyKTsKCXJlc3VsdCA9IG1hdF9tdWwocmVzdWx0LCByZXN1bHQpOwoJaWYobiAlIDIgPT0gMSl7CgkJcmVzdWx0ID0gbWF0X211bChyZXN1bHQsIGEpOwoJfQoJcmV0dXJuIHJlc3VsdDsKfQoKaW50IG1haW4oKSB7CgkKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CgljaW4udGllKDApOwoJCglpbnQgdDsKCWNpbiA+PiB0OwoJCgl3aGlsZSh0LS0pewoJCWxvbmcgbG9uZyBuOwoJCWNpbiA+PiBuOwoJCWlmKG4gPD0gMil7CgkJCXN0cmluZyBzdHI7CgkJCWNpbiA+PiBzdHI7CgkJCWludCBhbnN3ZXIgPSAwOwoJCQlpbnQgeCA9IG4gPT0gMSA/IDEwIDogMTAwOwoJCQlmb3IoaW50IGkgPSAwOyBpIDwgeDsgaSsrKXsKCQkJCWJvb2wgY2hlY2sgPSB0cnVlOwoJCQkJZm9yKGludCBqID0gMTsgaiA8PSA2OyBqKyspewoJCQkJCWNoZWNrICY9IChzdHJbaiAtIDFdID09ICcwJyBhbmQgaSAlIGogIT0gMCkgb3IgKHN0cltqIC0gMV0gPT0gJzEnIGFuZCBpICUgaiA9PSAwKSBvciAoc3RyW2ogLSAxXSA9PSAnMicpOwoJCQkJfQoJCQkJYW5zd2VyICs9IGNoZWNrOwoJCQl9CgkJCWNvdXQgPDwgYW5zd2VyIDw8ICJcbiI7CgkJfWVsc2V7CgkJCQoJCQl2ZWN0b3I8Ym9vbD4gY2hlY2soNjAsIHRydWUpOwoJCQkKCQkJc3RyaW5nIHN0cjsKCQkJY2luID4+IHN0cjsKCQkJCgkJCWZvcihpbnQgaSA9IDE7IGkgPD0gNjsgaSsrKXsKCQkJCWlmKHN0cltpIC0gMV0gPT0gJzAnKXsKCQkJCQlmb3IoaW50IGogPSAwOyBqIDwgNjA7IGorKyl7CgkJCQkJCWlmKGogJSBpID09IDApewoJCQkJCQkJY2hlY2tbal0gPSBmYWxzZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX1lbHNlIGlmKHN0cltpIC0gMV0gPT0gJzEnKXsKCQkJCQlmb3IoaW50IGogPSAwOyBqIDwgNjA7IGorKyl7CgkJCQkJCWlmKGogJSBpICE9IDApewoJCQkJCQkJY2hlY2tbal0gPSBmYWxzZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQkJaW50IHgxID0gMDsKCQkJaW50IHgyID0gMDsKCQkJCgkJCWZvcihpbnQgaSA9IDA7IGkgPCA2MDsgaSsrKXsKCQkJCXgxICs9IGNoZWNrW2ldOwoJCQl9CgkJCQoJCQlmb3IoaW50IGkgPSAwOyBpIDwgNDA7IGkrKyl7CgkJCQl4MiArPSBjaGVja1tpXTsKCQkJfQoJCQkKCQkJdmVjdG9yPHZlY3Rvcjxsb25nIGxvbmc+PiBtYXQgPSB7ezEwLCA2fSwgezAsIDF9fTsKCQkJYXV0byB0ZW1wID0gcG93KG1hdCwgbiAtIDIpOwoJCQljb3V0IDw8ICgodGVtcFswXVswXSArIHRlbXBbMF1bMV0pICUgbW9kICogeDEgJSBtb2QgKyB4MikgJSBtb2QgPDwgIlxuIjsKCQkJCgkJfQoJfQoJCglyZXR1cm4gMDsKfQ==