rt,不要以为我是乱写的。
#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 bool 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]%10;//计算月份。
if(kk>n) break;//大于退出。
/* cout<<kk<<" "<<x-kk*pow(10,i-1)<<endl;
if(x-kk*pow(10,i-1)==23) pr("hello\n");*/
if(a[kk]>=(x-kk*pow(10,i-1))) //计算改月天数是否 >= 剩下未切割部分(天数)。
ans[++sum].first=kk,ans[sum].second=(x-kk*pow(10,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){//最大是 10^5 * 3 * 10^9 = 3 * 10^{14},多按一个零没关系。
if(tt>=10) cut(tt);
tt*=k;
}
cout<<sum<<endl;
rep(i,1,sum) cout<<ans[i].first<<" "<<ans[i].second<<std::endl;
}
return 0;
}