#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<long long, null_type,less<>, rb_tree_tag,tree_order_statistics_node_update>

using ll = long long;
using ull = unsigned long long;
using ld = long double;
using vll = vector<ll>;
using pll = pair<ll, ll>;
using mll = map<ll,ll>;
using sll = set<ll>;
#define iv(v) for(auto &i:v) cin >> i
#define ov(v) for(auto &i:v) cout << i << " "
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define yes cout << "YES\n"
#define no cout << "NO\n"

#define Bismillah ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

const ll MOD = 1e9 + 7;

ll add(ll a, ll b, ll mod=MOD) {return ((a % mod) + (b % mod)) % mod;}
ll mul(ll a, ll b, ll mod=MOD) {return ((a % mod) * (b % mod)) % mod;}
ll sub(ll a, ll b) {return (((a - b) % MOD) + MOD) % MOD;}
ll modExp(ll a, ll b) {
    if (b <= 0) return 1;
    ll ret = modExp(a * a % MOD, b / 2);
    if (b % 2) ret = ret * a % MOD;
    return ret;
}
ll inverse(ll b) {return modExp(b, MOD - 2);}
ll divv(ll a, ll b) {return ((a % MOD) * (inverse(b) % MOD)) % MOD;}


#define ull ll
void solve(ll t) {
    ll k,m;
    cin >> k >> m;
    vll v(m);
    iv(v);
    ll x=1;
    ll ans=0;
    for (ll i=m-1; i>=0; i--) {
        if(v[i]==0) ans=add(ans,x);
        x=mul(x,k);
    }
    cout << ans << endl;
}
int main() {
    ll t=1;
    cin >> t;
    for (int i=1; i<=t; i++) {
        solve(i);
    }

    return 0;
}