rt,其余都是 WA,都是第 x 行第 1 列和答案相差 1,2。
#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 int qpow(int a1,int b1){
int res=1;
while(b1){
if(b1&1) res=res*a1;
a1=a1*a1;
b1>>=1;
}
return res;
}
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;
int temp=(x-kk*qpow(10ll,i-1));
if(a[kk]>=temp&&temp>0) ans[++sum].first=kk,ans[sum].second=temp;
}
}
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;
}