rt,给个 HACK 也行。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define rrep(i,x,y) for(int i=x;i>=y;i--)
#define sc scanf
#define pr printf
#define endline pr("\n")
inline int read(){int s=0,w=1;char c=getchar();while(!isdigit(c)){if(c=='-') w=-1;c=getchar();}while(isdigit(c)){s=(s<<1)+(s<<3)+(c^48);c=getchar();}return s*w;}
const int N=3e5+10;
int T,n,k,sum,a[N],t[N];
struct node{
int first,second;
};
node ans[20005];
inline void cut(int x){
int p=x,cnt=0;
while(p){
t[++cnt]=p%10;
p/=10;
}int kk=0;
rrep(i,cnt,1){
kk=kk*10+t[i];
if(kk>n) break;
if(!t[i-1]&&i>1) continue;
if(a[kk]>=(x-kk*pow(10ll,i-1))) ans[++sum].first=kk,ans[sum].second=((x-kk*pow(10ll,i-1)));
}
}
inline bool cmp(node s1,node s2){
if(s1.first==s2.first) return s1.second<s2.second;
return s1.first<s2.first;
}
signed main(){
T=read();
while(T--){
n=read();k=read();
rep(i,1,n) a[i]=read();
sum=0;
if(k==1){
pr("0\n");
continue;
}
int tt=1;
while(tt<=1000000000000000/k){
if(tt>=10) cut(tt);
tt*=k;
}
sort(ans+1,ans+1+sum,cmp);
cout<<sum<<endl;
rep(i,1,sum) cout<<ans[i].first<<" "<<ans[i].second<<std::endl;
}
return 0;
}