2018ICPC青岛站 D . Magic Multiplication(构造 模拟)

简介: 2018ICPC青岛站 D . Magic Multiplication(构造 模拟)

linkkk

题意:

定义一个新运算为两个数A,B上每一位相乘,然后顺次接在一起,现在给定结果C和原来两个数字的长度,要求恢复成原来的数字A,B

若有多解输出A字典序最小的,A相同输出B字典序最小的,无解输出Impossible

思路:

枚举A的第一位数字,这样可以求出B,再用B去求A剩下的数字,同时检查是否合法。

有个问题就是两个一位数相乘会得到一位数或两位数,如果判断是用C的几位来求呢。

如果说当前满足的式子是z = ( x ∗ y ) m o d    10,已知x , z那么如果x > = z的话,z就是一位数;否则,z是两位数。但是如果z = = 0的时候也是一位数。

然后模拟就好了,细节比较多。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;typedef unsigned long long ull;
typedef pair<ll,ll>PLL;typedef pair<int,int>PII;typedef pair<double,double>PDD;
#define I_int ll
inline ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
#define read read()
#define rep(i, a, b) for(int i=(a);i<=(b);++i)
#define dep(i, a, b) for(int i=(a);i>=(b);--i)
ll ksm(ll a,ll b,ll p){ll res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;}
const int maxn=4e5+7,maxm=1e6+7,mod=1e9+7;
int n,m,pos=0,len;
int a[maxn],b[maxn],c[maxn];
int pa=0,pb=0,pc=0;
int ans_a[maxn],ans_b[maxn];
int getb(int x){//a[1]=x
    pb=0;
    int idx=0;
    while(pos<len&&idx<m){
        int now=c[pos];
        if(now>=x){
            if(now%x) return 0;
            b[idx]=now/x;
            idx++;
        }
        else{
            if(pos==len-1&&now!=0) return -100;
            if(now!=0) now=now*10+c[++pos];
            if(now%x) return 0;
            b[idx]=now/x;
            idx++;
        }
        pos++;
    }
    pb=idx;
  //  cout<<idx<<" "<<m<<" "<<pos<<" "<<len<<endl;
    if(idx==m) return 1;
    return 0;
}
int geta(int x){
  pa=1;
  a[0]=x;
    int bf=b[0];
  while(pos<len&&pa<n){
    int now=c[pos];
    int ta=0;
    if(now>=bf){
      if(now%bf) return 0;
      a[pa]=now/bf;
      ta=now/bf;
      pa++;
    }
    else{
      if(pos+1==len&&now!=0) return 0;
      if(now!=0) now=now*10+c[++pos];
      if(now%bf) return 0;
      a[pa]=now/bf;
      ta=now/bf;
      pa++;
    }
    pos++;
    for(int i=1;i<m;i++){
      int tb=b[i];
      int num=ta*tb;
      int now=c[pos];
      if(num>=10){
        if(pos==len-1) return 0; 
        now=now*10+(c[++pos]);
        if(num!=now) return 0;
      }
      else{
        if(num!=now) return 0;
      }
      pos++;
    }
  }
  //cout<<pos<<"**"<<len<<endl;
  if(pa!=n||pos!=len) return -5;
  return 1;
}
int main(){
    int _=read;
    while(_--){
        n=read,m=read;
        string s;cin>>s;
        len=s.size();
        pos=0;
        for(int i=0;i<len;i++){
          c[i]=s[i]-'0';
        }
        pa=pb=pc=0;
        bool flag=0;
        for(int i=1;i<=9;i++){
          pos=0;
          int ff=getb(i);
            /*if(i==1){
              cout<<ff<<endl;
              for(int i=0;i<m;i++) cout<<b[i];
              puts("");
            }*/
            if(ff==1){
                int f=geta(i);
                /*if(i==1){
                  cout<<f<<endl;
                  for(int i=0;i<n;i++) cout<<a[i];
                puts("");
                }*/
                if(f==1){
                    for(int i=0;i<n;i++) ans_a[i]=a[i];
                    for(int i=0;i<m;i++) ans_b[i]=b[i];
                    flag=1;
                    break;
                }
            }
        }
       // cout<<flag<<endl;
        if(flag){
          rep(i,0,n-1) printf("%d",ans_a[i]);
          printf(" ");
          rep(i,0,m-1) printf("%d",ans_b[i]);
          puts("");
        }
        else puts("Impossible");
    }
    return 0;
}
/*
1
2 2
8101215
*/


目录
相关文章
|
22天前
|
算法 数据挖掘
Sentieon | 每周文献-Population Sequencing-第二十三期
Sentieon | 每周文献-Population Sequencing-第二十三期
24 1
|
22天前
|
算法 数据挖掘
Sentieon | 每周文献-Population Sequencing-第二十四期
Sentieon | 每周文献-Population Sequencing-第二十四期
29 1
|
22天前
|
人工智能 自然语言处理 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-131 Beaver‘s Calculator
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-131 Beaver‘s Calculator
97 43
|
11月前
2021山东省赛 M . Matrix Problem(构造)
2021山东省赛 M . Matrix Problem(构造)
40 0
(数学)(必要解题步骤)2021icpc上海D. Strange Fractions
(数学)(必要解题步骤)2021icpc上海D. Strange Fractions
48 0
ICPC Greater New York Region 2020 (模拟)
ICPC Greater New York Region 2020 (模拟)
77 0
ICPC North Central NA Contest 2018 C . Rational Ratio(结论 模拟 gcd)
ICPC North Central NA Contest 2018 C . Rational Ratio(结论 模拟 gcd)
89 0
2019ICPC上海K-Color Graph(二分图 状压枚举)
2019ICPC上海K-Color Graph(二分图 状压枚举)
60 0
codeforces1210——A.Anadi and Domino(思维+枚举)
codeforces1210——A.Anadi and Domino(思维+枚举)
58 0
|
机器学习/深度学习
2019ICPC上海Spanning Tree Removal构造题
本题是一个spj的问题 题意是给定一个完全图,包含了n个节点,每次可以在这个图中选择一个生成树,然后将该生成树的所有边都删除,然后得到一个新图,然后再从新的图中重复上述操作,问最多可以操作多少次,对于每一次操作,输出选择的生成树中的所有边(n-1行) 在lc哥的图中稍加改造,做成这个样子: 图中有6个点,将点按照0 -> 5编号
84 0
2019ICPC上海Spanning Tree Removal构造题

热门文章

最新文章