样例不过悬关求调
查看原帖
样例不过悬关求调
1121995
2021zjhs005楼主2024/3/10 19:07

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;
}
2024/3/10 19:07
加载中...