原题:

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. 自动化运维:(1)认识 Shell

    目录 (一)运维是什么? (二)什么是 Shell? (三)Shell的分类 (四)Shell脚本 (五)Shell的变量 (六)表达式 (七)Linux常见符号 (八)常见命令 (一)自动化运维是什 ...

  2. LeetCode.1184-公交车站之间的距离(Distance Between Bus Stops)

    这是小川的第次更新,第篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第265题(顺位题号是1184).公交车有n个从0到n-1的车站,形成一个圆圈.我们知道所有相邻车站对之间的 ...

  3. 【Gym - 100923I】Por Costel and the Pairs(思维题)

    Por Costel and the Pairs Descriptions 有T组测试样例 有n个男的,n个女的,第i个人都有为当前一个大小为i的懒惰值,当一男一女懒惰值的乘积<=n他们就就可以 ...

  4. PI膜热作用机理

    一.热分析法: 二.研究成果 1.PI膜热老化机理 实验条件:8根500w的碘钨灯加热,200倍光学显微镜观察,PI膜的技术指标 实验概述:本研究分别以150 ℃ ,  175 ℃ , 200 ℃ , ...

  5. server 2008 R2 DHCP服务器部署

    安装DHCP服务器 和上一篇文章中安装IIS 7.0一样,我们在安装DHCP服务器的时候也要用到Windows Server 2008的服务器安装器. 首先打开服务器管理器,点击开始菜单——>管 ...

  6. 使用PowerShell 自动安装IIS 及自动部署网站

    执行环境:Windows Server 2012 R2 安装iis核心代码,可自定义安装项 注意这里不能使用add-windowsfeature  "Web-Filtering", ...

  7. [转帖]mysql8.0忘记密码如何操作?

    mysql8.0忘记密码如何操作? https://www.cnblogs.com/gspsuccess/p/11245314.html mark 一下 上次竟然不知道怎么弄. 很不幸,刚安装了MYS ...

  8. 数据检索grep

    linux操作中,总是会输出很多的内容.但是有些内容并不是我们重点关注的,所以为了看起来方便,也为了提升效率,就将不需要的内容过滤掉.  只输出想要的东西. grep: 用于搜索 模式参数(给定的字符 ...

  9. 【LOJ】#3034. 「JOISC 2019 Day2」两道料理

    LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...

  10. 从入门到自闭之Python--RESTful API规范与序列化

    RESTful API规范 REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fieldi ...