2018 Qingdao D

El significado de los problemas

Demasiado perezoso para decir

solución del problema

Enumerar UNA UNA primer lugar, obtener si si .
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 si si , a su vez get UNA UNA . Cada vez que mira UNA UNA tiempo para asegurar que la resultante UNA UNA es el mismo valor.
Garantizado para conseguir el valor (la probabilidad de encontrar legal)
no se garantiza que avance hasta el final ( UNA UNA serie configurado no End)
garantizar dígitos
garantizar si si 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");
    }
}

Publicados 203 artículos originales · ganado elogios 17 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/mxYlulu/article/details/104997808
Recomendado
Clasificación