#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 1e9+7;
int calc(vector<int> &v , int k){
int res = 1;
for(auto &it : v){
if(it == 0) res = (res * k) % MOD;
}
return res;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while(t--){
int n, k;
cin >> n >> k;
vector<int> v(n);
for(auto &it : v) cin >> it;
int i = 0, j = n-1;
int ans = calc(v, k);
vector<int> pal = v;
bool isPal = true;
while(i < j){
if(v[i] > 0 && v[j] > 0){
if(v[i] != v[j]){
isPal = false;
break;
}
}
else if(v[i] == 0 && v[j] == 0){
// Do nothing
}
else{
if(v[i] == 0){
pal[i] = pal[j];
}
else{
pal[j] = pal[i];
}
}
i++; j--;
}
int revs = 0;
if(isPal){
int curr = 1;
for(auto &it : pal){
if(it == 0) curr = (curr * k) % MOD;
}
revs = curr;
}
int pals = 0;
if(isPal){
i = 0; j = n-1;
int curr = 1;
while(i <= j){
if(pal[i] == 0 && pal[j] == 0){
curr = (curr * k) % MOD;
}
i++; j--;
}
pals = curr;
}
int totRev = (revs - pals + MOD) % MOD;
totRev = (totRev * 500000004) % MOD;
cout << (ans - totRev + MOD) % MOD << endl;
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwpjb25zdCBpbnQgTU9EID0gMWU5Kzc7CgppbnQgY2FsYyh2ZWN0b3I8aW50PiAmdiAsIGludCBrKXsKICAgIGludCByZXMgPSAxOwogICAgZm9yKGF1dG8gJml0IDogdil7CiAgICAgICAgaWYoaXQgPT0gMCkgcmVzID0gKHJlcyAqIGspICUgTU9EOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBpbnQgdDsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUodC0tKXsKICAgICAgICBpbnQgbiwgazsKICAgICAgICBjaW4gPj4gbiA+PiBrOwogICAgICAgIHZlY3RvcjxpbnQ+IHYobik7CiAgICAgICAgZm9yKGF1dG8gJml0IDogdikgY2luID4+IGl0OwogICAgICAgIAogICAgICAgIGludCBpID0gMCwgaiA9IG4tMTsKICAgICAgICBpbnQgYW5zID0gY2FsYyh2LCBrKTsKICAgICAgICB2ZWN0b3I8aW50PiBwYWwgPSB2OwogICAgICAgIGJvb2wgaXNQYWwgPSB0cnVlOwoKICAgICAgICB3aGlsZShpIDwgail7CiAgICAgICAgICAgIGlmKHZbaV0gPiAwICYmIHZbal0gPiAwKXsKICAgICAgICAgICAgICAgIGlmKHZbaV0gIT0gdltqXSl7CiAgICAgICAgICAgICAgICAgICAgaXNQYWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHZbaV0gPT0gMCAmJiB2W2pdID09IDApewogICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBpZih2W2ldID09IDApewogICAgICAgICAgICAgICAgICAgIHBhbFtpXSA9IHBhbFtqXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgcGFsW2pdID0gcGFsW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGkrKzsgai0tOwogICAgICAgIH0KCiAgICAgICAgaW50IHJldnMgPSAwOwogICAgICAgIGlmKGlzUGFsKXsKICAgICAgICAgICAgaW50IGN1cnIgPSAxOwogICAgICAgICAgICBmb3IoYXV0byAmaXQgOiBwYWwpewogICAgICAgICAgICAgICAgaWYoaXQgPT0gMCkgY3VyciA9IChjdXJyICogaykgJSBNT0Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV2cyA9IGN1cnI7CiAgICAgICAgfQoKICAgICAgICBpbnQgcGFscyA9IDA7CiAgICAgICAgaWYoaXNQYWwpewogICAgICAgICAgICBpID0gMDsgaiA9IG4tMTsKICAgICAgICAgICAgaW50IGN1cnIgPSAxOwogICAgICAgICAgICB3aGlsZShpIDw9IGopewogICAgICAgICAgICAgICAgaWYocGFsW2ldID09IDAgJiYgcGFsW2pdID09IDApewogICAgICAgICAgICAgICAgICAgIGN1cnIgPSAoY3VyciAqIGspICUgTU9EOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaSsrOyBqLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFscyA9IGN1cnI7CiAgICAgICAgfQoKICAgICAgICBpbnQgdG90UmV2ID0gKHJldnMgLSBwYWxzICsgTU9EKSAlIE1PRDsKICAgICAgICB0b3RSZXYgPSAodG90UmV2ICogNTAwMDAwMDA0KSAlIE1PRDsgIAoKICAgICAgICBjb3V0IDw8IChhbnMgLSB0b3RSZXYgKyBNT0QpICUgTU9EIDw8IGVuZGw7CiAgICB9Cn0K