#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using lld = double;
#define srt(a) sort(a.begin(),a.end());
#define rsrt(a) sort(a.rbegin(),a.rend());
#define pb push_back
using pll=pair<ll,ll>;
#define fi(a,b,c) for(ll a=b;a<c;a++)
#define f(a,c) for(ll a=0;a<c;a++)
#define rf(a,c) for(ll a=c;a>=0;a--)
#define cye cout<<"Yes\n"
#define cno cout<<"No\n"
#define vll vector<ll>
ll mod=676767677,N=1e6;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
ll t;
cin>>t;
while(t--){
ll n,m,fl=0,ans=1,c=0;
cin>>n>>m;
map<ll,ll> mp;
map<ll,vll> b;
vll a(n),si(m);
f(i,n){cin>>a[i];mp[a[i]]++;}
//cout<<fl<<' ';
f(i,n){
b[a[i]].pb(i);
}
f(i,m){
si[i]=b[i].size();
if(mp[i]==0){fl=1;break;}
}
//cout<<fl<<' ';
fi(i,1,n-1){
if(a[i]<=a[i-1]&&a[i]<=a[i+1]&&a[i]!=0){fl=1;break;}
}
//cout<<fl<<' ';
if(n!=1){
if(a[0]<=a[1]&&a[0]!=0)fl=1;
if(a[n-1]<=a[n-2]&&a[n-1]!=0)fl=1;
}
//cout<<fl<<' ';
if(fl){cout<<"0\n";continue;}
f(i,m){
if(i==0){
c+=b[i].size();
continue;
}
for(auto u:b[i]){
ll mi=1e10;
if(u>0)mi=min(mi,a[u-1]);
if(u<n-1)mi=min(mi,a[u+1]);
if(mi==i-1)ans=(ans*c)%mod;
else ans=(ans*si[i-1])%mod;
}
c+=si[i];
}
cout<<ans<<'\n';
}
return 0;
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBsbCA9IGxvbmcgbG9uZzsKdXNpbmcgbGxkID0gZG91YmxlOwojZGVmaW5lIHNydChhKSBzb3J0KGEuYmVnaW4oKSxhLmVuZCgpKTsKI2RlZmluZSByc3J0KGEpIHNvcnQoYS5yYmVnaW4oKSxhLnJlbmQoKSk7CiNkZWZpbmUgcGIgcHVzaF9iYWNrCnVzaW5nIHBsbD1wYWlyPGxsLGxsPjsKI2RlZmluZSBmaShhLGIsYykgZm9yKGxsIGE9YjthPGM7YSsrKQojZGVmaW5lIGYoYSxjKSBmb3IobGwgYT0wO2E8YzthKyspCiNkZWZpbmUgcmYoYSxjKSBmb3IobGwgYT1jO2E+PTA7YS0tKQojZGVmaW5lIGN5ZSBjb3V0PDwiWWVzXG4iCiNkZWZpbmUgY25vIGNvdXQ8PCJOb1xuIgojZGVmaW5lIHZsbCB2ZWN0b3I8bGw+IApsbCBtb2Q9Njc2NzY3Njc3LE49MWU2OwppbnQgbWFpbigpewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwogICAgY291dC50aWUoTlVMTCk7CiAgICBsbCB0OwogICAgY2luPj50OwogICAgd2hpbGUodC0tKXsKICAgIGxsIG4sbSxmbD0wLGFucz0xLGM9MDsKICAgIGNpbj4+bj4+bTsKICAgIG1hcDxsbCxsbD4gbXA7CiAgICBtYXA8bGwsdmxsPiBiOwogICAgdmxsIGEobiksc2kobSk7CiAgICBmKGksbil7Y2luPj5hW2ldO21wW2FbaV1dKys7fQogICAgLy9jb3V0PDxmbDw8JyAnOwogICAgZihpLG4pewogICAgICAgIGJbYVtpXV0ucGIoaSk7CiAgICB9CiAgICBmKGksbSl7CiAgICAgICAgc2lbaV09YltpXS5zaXplKCk7CiAgICAgICAgaWYobXBbaV09PTApe2ZsPTE7YnJlYWs7fQogICAgfQogICAgLy9jb3V0PDxmbDw8JyAnOwogICAgZmkoaSwxLG4tMSl7CiAgICAgICAgaWYoYVtpXTw9YVtpLTFdJiZhW2ldPD1hW2krMV0mJmFbaV0hPTApe2ZsPTE7YnJlYWs7fQogICAgfQogICAgLy9jb3V0PDxmbDw8JyAnOwogICAgaWYobiE9MSl7CiAgICAgICAgaWYoYVswXTw9YVsxXSYmYVswXSE9MClmbD0xOwogICAgICAgIGlmKGFbbi0xXTw9YVtuLTJdJiZhW24tMV0hPTApZmw9MTsKICAgIH0KICAgIC8vY291dDw8Zmw8PCcgJzsKICAgIGlmKGZsKXtjb3V0PDwiMFxuIjtjb250aW51ZTt9CiAgICBmKGksbSl7CiAgICAgICAgaWYoaT09MCl7CiAgICAgICAgICAgIGMrPWJbaV0uc2l6ZSgpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZm9yKGF1dG8gdTpiW2ldKXsKICAgICAgICAgICAgbGwgbWk9MWUxMDsKICAgICAgICAgICAgaWYodT4wKW1pPW1pbihtaSxhW3UtMV0pOwogICAgICAgICAgICBpZih1PG4tMSltaT1taW4obWksYVt1KzFdKTsKICAgICAgICAgICAgaWYobWk9PWktMSlhbnM9KGFucypjKSVtb2Q7CiAgICAgICAgICAgIGVsc2UgYW5zPShhbnMqc2lbaS0xXSklbW9kOwogICAgICAgIH0KICAgICAgICBjKz1zaVtpXTsKICAgIH0KICAgIGNvdXQ8PGFuczw8J1xuJzsKICAgIH0KICAgIHJldHVybiAwOwp9