原题:

Given a,b,c, find an arbitrary set of x,y,z such that a*10^x+b*10^y=c*10^z and 0≤x,y,z≤10^6.

给你三个高精度数a、b、c,要求找出任意一组x、y、z满足a*10^x+b*10^y=c*10^z

首先需要发现一个性质

乘上10的幂会往数的最后面填上0,而不会对最前面的位造成影响

一开始我的思路是考虑三个数的个位,这种就很麻烦了

(听说能忽略前导零然后讨论,但我总觉得是假做法)

考虑前面位的话,就只有几种情况:

①a、b、c对齐

②a和b对齐,然后相加进一位,然后和c对齐

③a和c对齐,b在中间

④a加上b进一位和c对齐

⑤⑥同③④

(注意重要性质:加法最多只会进1,最多增加1位)

前两个可以a+b然后判断

后两个可以c-a然后判断

(这里的a、b、c都是指对齐过的)

所有情况都判断一下找到一组解就vans了

接下来就是喜闻乐见的码农时间

因为情况比较多,所以用工具函数,数组作为参数,以a[0]作为a的长度,这样是非常舒服的

一开始写的是二分,即a和c对齐后二分b左移的位数

但是又100组数据,1e6*log1e6*100肯定T了

实际上不用二分,直接减然后判断是比较简单的

另外,第一次写的时候左移是用函数里的参数控制的,这样写前两个还好,后四个情况再带上减法会及其麻烦

写到后期把减法加进去后代码直接崩溃了,前言不搭后语

最后额外开三个高精度数,写一个左移函数,用函数额外的一个参数表示高精度运算过后的结果放到哪里

这样写下来一气呵成,很顺利

所以说代码自动化和通用工具函数还是很有用的

(一开始写屎的锅就是因为中午没睡一脸蒙蔽=。=)

总结经验:
1.有时候不要贪图局部的代码方便

尤其是不要偷懒,为了想起来简单而放弃写通用函数

2.结构化程序设计(或者工具函数、代码自动化)带来的加成是惊人的

甚至可以为了这些放弃别的东西,比如代码复杂度,比如常数

3.敢于重构代码

又一个实例证明重构利大于弊

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int a[],b[],c[],d[];
int e[],f[],g[];
void clr(int x[]){
for(int i=;i<=x[];++i) x[i]=;
x[]=;
}
void rvs(int x[]){
clr(d);
d[]=x[];
for(int i=;i<=d[];++i) d[i]=x[i];
for(int i=;i<=d[];++i) x[i]=d[d[]-i+];
}
void rd(int x[]){
clr(x);
char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){
x[++x[]]=ch-'';
ch=getchar();
}
rvs(x);
}
void cpy(int x[],int y[]){
clr(y);
y[]=x[];
for(int i=;i<=x[];++i) y[i]=x[i];
}
void lm(int x[],int y,int z[]){
cpy(x,z);
for(int i=z[];i>=;--i) z[i+y]=z[i];
for(int i=;i<=y;++i) z[i]=;
z[]+=y;
}
void pls(int x[],int y[],int z[]){
clr(z);
z[]=max(x[],y[]);
for(int i=;i<=x[];++i) z[i]+=x[i];
for(int i=;i<=y[];++i) z[i]+=y[i];
for(int i=;i<=z[];++i)if(z[i]>=){
z[i+]+=z[i]/;
z[i]%=;
}
if(z[z[]+]) ++z[];
}
void mns(int x[],int y[],int z[]){
cpy(x,z);
for(int i=;i<=z[];++i){
z[i]-=y[i];
if(z[i]<){
z[i]+=;
--z[i+];
}
}
while(!z[z[]]) --z[];
}
int cmp(int x[],int y[]){
if(x[]<y[]) return -;
if(x[]>y[]) return ;
for(int i=x[];i>=;--i){
if(x[i]<y[i]) return -;
if(x[i]>y[i]) return ;
}
return ;
}
void ot(int x,int y,int z){
int mn=min(x,min(y,z));
printf("%d %d %d\n",x-mn,y-mn,z-mn);
}
int chck(int x[],int y[]){
if(x[]<y[]) return -;
for(int i=y[],j=x[];i>=;--i,--j)
if(y[i]!=x[j]) return -;
for(int i=;i<=y[]-x[];++i)
if(x[i]) return -;
return x[]-y[];
}
void gogogo(){
int mxl=max(a[],max(b[],c[]));
lm(a,mxl-a[],e),lm(b,mxl-b[],f),lm(c,mxl-c[],g);
pls(e,f,d);
if(!cmp(d,g)){
ot(mxl-a[],mxl-b[],mxl-c[]);
return ;
}
lm(c,mxl-c[]+,g);
if(!cmp(d,g)){
ot(mxl-a[],mxl-b[],mxl-c[]+);
return ;
}
int tmx=max(a[]+b[],c[])+b[]-;
lm(a,tmx-a[],e),lm(b,tmx-b[],f),lm(c,tmx-c[],g);
if(cmp(g,e)==){
mns(g,e,d);
int tmp=chck(d,b);
if(tmp!=-){
ot(tmx-a[],tmp,tmx-c[]);
return ;
}
}
if(cmp(g,f)==){
mns(g,f,d);
int tmp=chck(d,a);
if(tmp!=-){
ot(tmp,tmx-b[],tmx-c[]);
return ;
}
}
lm(c,tmx-c[]+,g);
if(cmp(g,e)==){
mns(g,e,d);
int tmp=chck(d,b);
if(tmp!=-){
ot(tmx-a[],tmp,tmx-c[]+);
return ;
}
}
if(cmp(g,f)==){
mns(g,f,d);
int tmp=chck(d,a);
if(tmp!=-){
ot(tmp,tmx-b[],tmx-c[]+);
return ;
}
}
printf("-1\n");
}
void prvs(){
clr(a),clr(b),clr(c),clr(d);
}
int main(){
freopen("ddd.in","r",stdin);
a[]=,b[]=,c[]=,d[]=;
int T; cin>>T;
while(T --> ){
prvs();
rd(a),rd(b),rd(c);
gogogo();
}
return ;
}

【杭电多校第七场】A + B = C的更多相关文章

  1. 杭电多校第七场 1010 Sequence(除法分块+矩阵快速幂)

    Sequence Problem Description Let us define a sequence as below f1=A f2=B fn=C*fn-2+D*fn-1+[p/n] Your ...

  2. 杭电多校第七场-J-Sequence

    题目描述 Let us define a sequence as belowYour job is simple, for each task, you should output Fn module ...

  3. hdu61272017杭电多校第七场1008Hard challenge

    Hard challenge Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) ...

  4. 2017杭电多校第七场1011Kolakoski

    Kolakoski Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Tota ...

  5. 2017杭电多校第七场1005Euler theorem

    Euler theorem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) ...

  6. 2019杭电多校第七场 HDU - 6656 Kejin Player——概率&&期望

    题意 总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层.接下来有 $q$ 次询问,每次询问 $ ...

  7. [2019杭电多校第七场][hdu6656]Kejin Player

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意为从i级花费a元有p的概率升到i+1级,有1-p的概率降到x级(x<i),查询从L级升 ...

  8. [2019杭电多校第七场][hdu6655]Just Repeat

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6655 题意是说两个人都有一些带有颜色的牌,两人轮流出牌,但是不能出对面出过的颜色的牌,最后谁不能出牌谁 ...

  9. [2019杭电多校第七场][hdu6651]Final Exam

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6651 题意:n个科目,总共m分,通过一科需要复习花费科目分数+1分钟,在不知道科目分数的情况下,问最少 ...

随机推荐

  1. MySQL知识篇-SQL1

    1 SQL是什么? 答:是结构话语言,是一种操作关系型数据库的语言. 2 SQL语言分类? SQL语言 说明 举例 DDL 数据定义语言 create  drop DML 数据操作语言 insert ...

  2. 【VS开发】uafxcwd.lib(afxmem.obj) : error LNK2005: 已经在 LIBCMTD.lib(new.obj) 中定义错误解决方案

    如果在编译MFC程序的时候出现下列及类似的错误: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator ...

  3. kubernetes 简单 hello world nginx svc deployment

    1.nginx svc deployment [root@k8s k8s4nginx]# cat deploynginx.yaml ################################# ...

  4. jQuery 虚拟数字键盘代码

    先上效果:    js直接应用:  $('input').mynumkb(); 就出来效果 HTML: <input maxlength="4" type="tex ...

  5. gitlab本地部署方法(ubuntu16.04+gitlab9.5.5)

    Gitlab本地部署方法   1 前期准备 电脑配置:windows7 ,内存8GB以上(因为有4GB左右要分配给虚拟机中的ubuntu) 虚拟机:VMware Linux系统:ubuntu16.04 ...

  6. 强大的strace命令用法详解

    文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和 ...

  7. 模仿ORM

    ORM 对象关系映射 类 ---------->映射--------->    表 对象 ------>映射---------->   一条记录 对象点属性 --->映射 ...

  8. Orchestrator

    MYSQL5.7下搭建Orchestrator 环境说明 在主机1,主机2,主机3上安装MySQL服务端和客户端. 主机1 主机2 主机3 操作系统 CentOS7.4 CentOS7.4 CentO ...

  9. docker-配置网桥-自定义网络

    容器网络访问原理 桥接宿主机网络 临时生效: # 网桥名称 br_name=br0 # 添加网桥 brctl addbr $br_name # 给网桥设置IP ip addr add 192.168 ...

  10. 树莓派安装SSH

    1. 安装ssh sudo apt-get install openssh-server 2. 检查树莓派SSH服务是否开启 ps -e|grep ssh 3. SSH服务开启 sudo /etc/i ...