【杭电多校第七场】A + B = C
原题:
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的更多相关文章
- 杭电多校第七场 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 ...
- 杭电多校第七场-J-Sequence
题目描述 Let us define a sequence as belowYour job is simple, for each task, you should output Fn module ...
- hdu61272017杭电多校第七场1008Hard challenge
Hard challenge Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) ...
- 2017杭电多校第七场1011Kolakoski
Kolakoski Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Tota ...
- 2017杭电多校第七场1005Euler theorem
Euler theorem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) ...
- 2019杭电多校第七场 HDU - 6656 Kejin Player——概率&&期望
题意 总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层.接下来有 $q$ 次询问,每次询问 $ ...
- [2019杭电多校第七场][hdu6656]Kejin Player
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意为从i级花费a元有p的概率升到i+1级,有1-p的概率降到x级(x<i),查询从L级升 ...
- [2019杭电多校第七场][hdu6655]Just Repeat
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6655 题意是说两个人都有一些带有颜色的牌,两人轮流出牌,但是不能出对面出过的颜色的牌,最后谁不能出牌谁 ...
- [2019杭电多校第七场][hdu6651]Final Exam
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6651 题意:n个科目,总共m分,通过一科需要复习花费科目分数+1分钟,在不知道科目分数的情况下,问最少 ...
随机推荐
- ASP.NET Core 入门笔记5,ASP.NET Core MVC控制器入门
摘抄自https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc-controller-action.html 一.前言 1.本教程主要内容 A ...
- 【VS开发】单文档中往视图中加入控件
[VS开发]单文档中往视图中加入控件 标签(空格分隔): [VS开发] 分隔视图的但文档窗口,要显示控件,推荐使用CFormView或者CCtrlView,前者和对话框的做法一致. 在MainFram ...
- Windows多线程编程入门笔记
每次处理并行任务时,如果要等待用户输入或依赖外部(如与灿亨控制器响应),就应该为类似的操作单独创建一个线程,这样我们的程序才不会挂起无响应. 静态库和动态库 静态库是指在程序运行前就编译完成的库,如# ...
- Java学习笔记-IO
IO(Input Output)流,用来处理设备之间的数据传输 IO IO概述 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 流按操作数据分为两种:字节流与字符流 流按流向 ...
- (5.15)mysql高可用系列——MHA实践
关键词:MHA,mysql mha [1]需求 采用mysql技术,实现MHA高可用主从环境,预计未来数据量几百G MHA概念参考:MYSQL高可用技术概述 [2]环境技术架构 [2.1]MHA简介 ...
- 安装oracle数据库11g及问题解决
安装步骤可借鉴https://www.cnblogs.com/qfb620/p/4577255.html 1.安装后发现用Navicat无法连接数据库显示报错ORA-28547:connection ...
- 编译错误ERROR C2027
一个工程编译时出错! 费了很多时间,增加头文件都不可取,然后把source File文件下分的.cpp文件删除,然后编译通过.
- PAT A1020 Tree Traversals(25)
题目描述 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder ...
- php 简单的 单例模式
php单例模式简单说明 使用注意事项: 1.使用时不能用反射模式创建单例,否则会实例化一个新的对象 2.使用懒单例模式时注意线程安全问题 3.饿单例模式和懒单例模式构造方法都是 ...
- URI解析
这里主要参考 RFC3986 文档. URI可以分为URL,URN或同时具备locators 和names特性的一个东西.URN作用就好像一个人的名字,URL就像一个人的地址.换句话说:URN确定了东 ...