#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;
}else{
vector<bool> check(60, true);
string str;
cin >> str;
int x1 = 60;
int x2 = 60;
for(int i = 1; i <= 6; i++){
if(str[i] == '0'){
for(int j = 0; j < 60; j++){
x1 -= (j % i == 0) && check[j];
if(j < 40){
x2 -= (j % i == 0) && check[j];
}
check[j] = check[j] && (j % i == 0);
}
}else if(str[i] == '1'){
for(int j = 0; j < 60; j++){
x1 -= (j % i != 0) && check[j];
if(j < 40){
x2 -= (j % i != 0) && check[j];
}
check[j] = check[j] && (j % i != 0);
}
}
}
vector<vector<long long>> mat = {{10, 6}, {0, 1}};
pow(mat, n - 2);
cout << ((mat[0][0] + mat[0][1]) % mod * x1 % mod + x2) % mod << "\n";
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBtb2QgPSAxMDAwMDAwMDA3OwoKCnZlY3Rvcjx2ZWN0b3I8bG9uZyBsb25nPj4gbWF0X211bCh2ZWN0b3I8dmVjdG9yPGxvbmcgbG9uZz4+JiBhcnIsIHZlY3Rvcjx2ZWN0b3I8bG9uZyBsb25nPj4mIGJycil7CgkKCXZlY3Rvcjx2ZWN0b3I8bG9uZyBsb25nPj4gcmVzdWx0KGFyci5zaXplKCksIHZlY3Rvcjxsb25nIGxvbmc+KGJyclswXS5zaXplKCkpKTsKCQoJZm9yKGludCBpID0gMDsgaSA8IGFyci5zaXplKCk7IGkrKyl7CgkJZm9yKGludCBqID0gMDsgaiA8IGJyclswXS5zaXplKCk7IGorKyl7CgkJCWZvcihpbnQgayA9IDA7IGsgPCBhcnJbMF0uc2l6ZSgpOyBrKyspewoJCQkJcmVzdWx0W2ldW2pdICs9IGFycltpXVtrXSAqIGJycltrXVtqXTsKCQkJCXJlc3VsdFtpXVtqXSAlPSBtb2Q7CgkJCX0KCQl9Cgl9CgkKCXJldHVybiByZXN1bHQ7CgkKfQoKdmVjdG9yPHZlY3Rvcjxsb25nIGxvbmc+PiBwb3codmVjdG9yPHZlY3Rvcjxsb25nIGxvbmc+PiYgYSwgbG9uZyBsb25nIG4pewoJaWYobiA9PSAxKXsKCQlyZXR1cm4gYTsKCX0KCWF1dG8gcmVzdWx0ID0gcG93KGEsIG4gLyAyKTsKCXJlc3VsdCA9IG1hdF9tdWwocmVzdWx0LCByZXN1bHQpOwoJaWYobiAlIDIgPT0gMSl7CgkJcmVzdWx0ID0gbWF0X211bChyZXN1bHQsIGEpOwoJfQoJcmV0dXJuIHJlc3VsdDsKfQoKaW50IG1haW4oKSB7CgkKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CgljaW4udGllKDApOwoJCglpbnQgdDsKCWNpbiA+PiB0OwoJCgl3aGlsZSh0LS0pewoJCWxvbmcgbG9uZyBuOwoJCWNpbiA+PiBuOwoJCWlmKG4gPD0gMil7CgkJCXN0cmluZyBzdHI7CgkJCWNpbiA+PiBzdHI7CgkJCQoJCX1lbHNlewoJCQkKCQkJdmVjdG9yPGJvb2w+IGNoZWNrKDYwLCB0cnVlKTsKCQkJCgkJCXN0cmluZyBzdHI7CgkJCWNpbiA+PiBzdHI7CgkJCQoJCQlpbnQgeDEgPSA2MDsKCQkJaW50IHgyID0gNjA7CgkJCQoJCQlmb3IoaW50IGkgPSAxOyBpIDw9IDY7IGkrKyl7CgkJCQlpZihzdHJbaV0gPT0gJzAnKXsKCQkJCQlmb3IoaW50IGogPSAwOyBqIDwgNjA7IGorKyl7CgkJCQkJCXgxIC09IChqICUgaSA9PSAwKSAmJiBjaGVja1tqXTsKCQkJCQkJaWYoaiA8IDQwKXsKCQkJCQkJCXgyIC09IChqICUgaSA9PSAwKSAmJiBjaGVja1tqXTsKCQkJCQkJfQoJCQkJCQljaGVja1tqXSA9IGNoZWNrW2pdICYmIChqICUgaSA9PSAwKTsKCQkJCQl9CgkJCQl9ZWxzZSBpZihzdHJbaV0gPT0gJzEnKXsKCQkJCQlmb3IoaW50IGogPSAwOyBqIDwgNjA7IGorKyl7CgkJCQkJCXgxIC09IChqICUgaSAhPSAwKSAmJiBjaGVja1tqXTsKCQkJCQkJaWYoaiA8IDQwKXsKCQkJCQkJCXgyIC09IChqICUgaSAhPSAwKSAmJiBjaGVja1tqXTsKCQkJCQkJfQoJCQkJCQljaGVja1tqXSA9IGNoZWNrW2pdICYmIChqICUgaSAhPSAwKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCXZlY3Rvcjx2ZWN0b3I8bG9uZyBsb25nPj4gbWF0ID0ge3sxMCwgNn0sIHswLCAxfX07CgkJCXBvdyhtYXQsIG4gLSAyKTsKCQkJY291dCA8PCAoKG1hdFswXVswXSArIG1hdFswXVsxXSkgJSBtb2QgKiB4MSAlIG1vZCArIHgyKSAlIG1vZCA8PCAiXG4iOwoJCQkKCQl9Cgl9CgkKCXJldHVybiAwOwp9