El significado de los problemas
Demasiado perezoso para decir
solución del problema
Enumerar
primer lugar, obtener
.
Garantía se obtiene por un solo dígito.
Esto es posible, porque no habrá un solo dígito se pueden obtener multiplicando los dos dígitos y se puede obtener de dos dígitos.
por
, a su vez get
. Cada vez que mira
tiempo para asegurar que la resultante
es el mismo valor.
Garantizado para conseguir el valor (la probabilidad de encontrar legal)
no se garantiza que avance hasta el final (
serie configurado no End)
garantizar dígitos
garantizar
gama cada vez que se completa la consulta
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5050;
int n,m,len;
int A[maxn],B[maxn],C[maxn];
bool slove1(int x){
int now=1,val=0,id=0;
while(now<=len&&id<m){
val=val*10+C[now];
if(val%x==0){
if(val/x>10)return false;
B[++id]=val/x;
val=0;
}
else if(val>10)return false;
now++;
}
return id==m;
}
int slove2(int aid,int pos){
int now=pos,val=0,id=1;
int ret=-1;
while(now<=len&&id<=m){
val=val*10+C[now];
if(B[id]==0){
if(val!=0)return false;
id++,val=0;
}
else if(val%B[id]==0){
if(val/B[id]>10)return false;
if(ret==-1)ret=val/B[id];
else if(ret!=val/B[id])return -1;
id++,val=0;
}
else if(val>10)return -1;
now++;
}
if(ret==-1||id!=m+1)return false;
A[aid]=ret;
if(now==len+1){
if(aid==n)return now;
else return -1;
}//提前结束是不对的。
else return now;
}
int main(){
int T;cin>>T;
while(T--){
len=0;
scanf("%d%d",&n,&m);
string str;cin>>str;
for(auto ch:str)C[++len]=ch-'0';
bool ok=false;
for(int i=1;i<=9;i++){
if(!slove1(i))continue;
// cout<<i<<":"<<endl;
//for(int j=1;j<=m;j++)printf("%d",B[j]);puts("");
int tmp=1;
for(int j=1;j<=n;j++){
tmp=slove2(j,tmp);
if(tmp==-1)break;
}
if(tmp!=len+1)continue;
ok=true;
break;
}
if(ok){
for(int i=1;i<=n;i++)printf("%d",A[i]);printf(" ");
for(int i=1;i<=m;i++)printf("%d",B[i]);printf("\n");
}
else puts("Impossible");
}
}