問題の意味
言うにはあまりにも怠惰
問題の解決策
列挙
まず、GET
。
保証は一桁によって得られます。
そこには一桁が両方の数字を乗じて得られることはないだろうと二桁を得ることができるので、これは、可能です。
によって
ターンGETで
。たびに探して
結果のことを保証するための時間
同じ値です。
(おそらく法的見つけるために)値を取得する保証は
(最後まで前進しないことが保証しました
配列構成されていないエンド)
桁確保
確保
配列クエリが完了するたびに
#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");
}
}