52 pts 求调
查看原帖
52 pts 求调
1121995
2021zjhs005楼主2024/3/10 19:48

rt,其余都是 WA,都是第 xx 行第 11 列和答案相差 1,21,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;
}
2024/3/10 19:48
加载中...